home *** CD-ROM | disk | FTP | other *** search
- ' ½ 1991-92 Jan Levern. Fidonet, 2:203/203.9
- '
- ' Last Edit 920224
- '
- DEFFN komma$(a$)=TRIM$(MID$(a$,INSTR(a$,",")+1))
- DEFFN cd=EVEN(BTST(DPEEK(&HFFFA00),1)) ! Carrier Detect
- '
- scs$=@enviroment$("SCS=")
- version$="0.02"
- setupvars
- init_date
- read_bbs.cfg
- '
- ' --------------------------------------
- '
- '
- ' --- Main
- '
- oldhomedir$=@cwd$
- homedir$=@enviroment$("SCS=")
- ~@chd(homedir$)
- '
- last_ac$="Boot up"
- last_err$="None"
- DIM statusline$(9)
- IF EXIST(scs$+"conf\statline.bbs")
- OPEN "i",#1,scs$+"conf\STATLINE.BBS"
- RECALL #1,statusline$(),10,a%
- CLOSE #1
- ENDIF
- '
- main
- ~@chd(oldhomedir$)
- EDIT
- '
- ' --- ... ---
- '
- > PROCEDURE main
- PRINT "Initiating BBS..."
- LOCAL t%,x%,y%,c&
- sluta!=FALSE
- c&=0
- '
- DO
- baud$="???"
- mailer:
- old_dir$=@cwd$
- ' mailer!=TRUE
- DO WHILE mailer!
- mailer_exit!=FALSE
- e%=@run(shell$,"D:\MAILER.BAT")
- PRINT " o Error ";e%;" detected from Mailer"
- SELECT e%
- CASE 0
- mailer_exit!=TRUE
- sluta!=TRUE
- CASE 3
- baud$="300"
- mailer_exit!=TRUE
- CASE 12
- baud$="1200"
- mailer_exit!=TRUE
- CASE 20
- ~@chd("B:\MAILER\")
- e%=@run("PACK.TTP","-t -s PLL")
- CASE 24
- baud$="2400"
- mailer_exit!=TRUE
- CASE 30
- ~@chd("B:\MAILER\")
- e%=@run("IMPORT.TTP","-t")
- CASE 48
- baud$="4800"
- mailer_exit!=TRUE
- CASE 96
- baud$="9600"
- mailer_exit!=TRUE
- CASE 128
- baud$="38400"
- mailer_exit!=TRUE
- CASE 144
- baud$="1440"
- mailer_exit!=TRUE
- CASE 192
- baud$="19200"
- mailer_exit!=TRUE
- CASE 100 !Local
- mailer_exit!=TRUE
- DEFAULT
- last_err$="Error "+STR$(e%)+" from Mailer"
- mailer_exit!=TRUE
- ENDSELECT
- LOOP UNTIL mailer_exit!
- ~@chd(old_dir$)
- '
- EXIT IF sluta!
- '
- @modem_stat
- IF NOT dcd!
- setup_modem
- ENDIF
- start:
- t%=TIMER
- rec%=0
- IF NOT dcd!
- modem(m.init1$)
- t%=TIMER
- '
- ~@dfree("")
- '
- CLS
- PRINT "Short break..."
- REPEAT
- UNTIL TIMER-t%=>400 !1.5 sek
- modem(m.init2$)
- ENDIF
- '
- hangup!=FALSE
- local!=FALSE
- CLR ioch#
- '
- s.msgs!=FALSE
- s.dc!=FALSE
- s.yell!=FALSE
- login|=0
- '
- start1:
- cursor(FALSE)
- IF NOT dcd!
- wait_screen
- ENDIF
- REPEAT
- @modem_stat
- IF INP?(2)
- SETCOLOR 0,1
- i$=UPPER$(CHR$(INP(2)))
- IF INSTR("EFTLMUQ"+CHR$(165)+CHR$(225),i$)
- PRINT "Off hook...";AT(1,14);
- modem(m.busy$)
- ENDIF
- ioch#=2
- SELECT i$
- CASE "W" !Test
- CLS
- e%=@run("D:\BIN\ENVTEST.TTP","Hej")
- PRINT "Press any key"
- ~INP(2)
- GOTO start
- CASE "E"
- last_ac$="Message Editor"
- PRINT "Running Message Editor..."
- e%=@run(editor$,"")
- GOTO start
- CASE "F"
- last_ac$="File Edit"
- PRINT "File Edit..."
- filemenu
- GOTO start
- CASE "L"
- last_ac$="Local BBS"
- PRINT "Lokal Login..."
- local!=TRUE
- baud$="0"
- CASE "M"
- last_ac$="Menu Edit"
- PRINT "Menu Edit..."
- local!=TRUE
- ~@init_userfile(99)
- rec%=1
- get_user(99,rec%)
- CLOSE #99
- menueditor
- GOTO start
- CASE "U"
- last_ac$="Useredit"
- PRINT "User Edit..."
- useredit
- GOTO start
- CASE "S"
- GOTO mailer
- CASE "T"
- last_ac$="Text Editor"
- PRINT "Running Text Editor..."
- e%=@run(text_editor$,"")
- GOTO start
- CASE "Q"
- last_ac$="Quick Login"
- PRINT "Quick Login..."
- ~@init_userfile(99)
- login|=BSET(login|,0)
- rec%=1
- get_user(99,rec%)
- local!=TRUE
- CASE 165
- last_ac$="Jump to Dos"
- jump_to_dos
- GOTO start
- CASE 225
- PRINT "Exit requested..."
- sluta!=TRUE
- CASE 226
- CLS
- PRINT
- PRINT " p Q q Quick login (only user 1)"
- PRINT
- PRINT " p L q Local login"
- PRINT
- PRINT " p U q User Editor"
- PRINT
- PRINT " p F q File Editor"
- PRINT
- PRINT " p M q Menu Editor"
- PRINT
- PRINT " p E q External Mail-Editor."
- PRINT
- PRINT " p T q External Text Editor"
- PRINT
- PRINT " p ALT q - p J q Jump to external dos-shell."
- PRINT
- PRINT " p UNDO q Quit"
- PRINT
- PRINT "Press ANY key"
- ~INP(2)
- GOTO start1
- DEFAULT
- PRINT "Asci ";ASC(i$);" has no function."
- ENDSELECT
- ELSE IF dcd!
- ioch#=1
- last_ac$="BBS"
- PRINT " o Carrier detected!"
- get_baud(baud|)
- local!=FALSE
- ELSE IF TIMER-t%>screensaver|*12000
- t%=TIMER
- SETCOLOR 0,c&
- c&=ABS(NOT c&)
- ELSE
- PRINT AT(1,1);"p";TIME$;AT(71,1);DATE$;"q"
- PRINT AT(1,14);
- ENDIF
- UNTIL dcd! OR local! OR sluta!
- SETCOLOR 0,1
- CLS
- '
- EXIT IF sluta!
- '
- login(login|)
- mainmenu("top","")
- '
- after_bbs
- '
- REPEAT
- IF INP?(1)
- ~INP(1)
- ENDIF
- wait(5)
- UNTIL INP?(1)=FALSE
- LOOP
- modem(m.reset$)
- RETURN
- > PROCEDURE wait_screen
- CLS
- a$="SCS BBS "+version$+" ½1991 Jan Levern"
- PRINT AT(1,1);"p";SPACE$(80);AT(40-(LEN(a$)/2),1);a$;"q"
- a$="EVENTS"
- PRINT AT(1,2);"p q";AT(1,9);"p q"
- FOR i%=1 TO 6
- PRINT AT(1,i%+2);"p";MID$(a$,i%,1);"q"
- NEXT i%
- FOR i%=0 TO 5
- PRINT AT(4,i%+3);SPACE$(ABS(i%<10));i%;":00 _____"
- PRINT AT(16,i%+3);SPACE$(ABS(i%+6<10));i%+6;":00 _____"
- PRINT AT(28,i%+3);i%+12;":00 _____"
- PRINT AT(40,i%+3);i%+18;":00 _____"
- NEXT i%
- mem%=INT(FRE(0)/1024)
- PRINT AT(58,2);"p";SPACE$(23);AT(60,2);"Mem: ";SPACE$(5-LEN(STR$(mem%)));mem%;
- FOR i%=1 TO 7
- PRINT AT(58,i%+2);SPACE$(23);AT(62,2+i%);CHR$(i%+64);": ";
- IF free%(i%)>-1
- PRINT SPACE$(5-LEN(STR$(free%(i%))));free%(i%);
- ELSE
- PRINT "-----";
- ENDIF
- NEXT i%
- FOR i%=8 TO 16
- PRINT AT(72,-6+i%);CHR$(i%+64);": ";
- IF free%(i%)>-1
- PRINT SPACE$(5-LEN(STR$(free%(i%))));free%(i%);
- ELSE
- PRINT "-----";
- ENDIF
- NEXT i%
- PRINT AT(58,10);SPACE$(14);AT(80,10);" q";
- a$="FREE"
- FOR i%=1 TO 4
- PRINT AT(60,i%+3);"p";MID$(a$,i%,1);"q"
- NEXT i%
- IF LEN(cur_ac$)=0
- cur_ac$="Waiting for Calls"
- ENDIF
- PRINT AT(1,10);"p";SPACE$(58);AT(1,10);"Activity: q"
- PRINT AT(1,11);"Last : ";last_ac$
- PRINT AT(1,12);"Current : ";cur_ac$
- PRINT AT(1,13);"Last Err: ";last_err$
- PRINT AT(1,15);"p Name On Off Sec Cred Msg Calls Dwn_Td/Dwn/Up Flags q"
- FOR i%=0 TO 9
- PRINT AT(1,i%+16);;statusline$(i%);
- NEXT i%
- PRINT AT(1,14);
- RETURN
- '
- ' --- User Editor ---
- '
- > PROCEDURE useredit
- local!=TRUE
- l%=@init_userfile(99)
- get_user(99,1)
- CLOSE #99
- l%=@init_t.userfile(99)
- rec%=0
- DO
- INC rec%
- IF rec%>l%
- rec%=l%
- ELSE IF rec%<1
- rec%=1
- ENDIF
- get_t.user(99,rec%)
- sysedit:
- sys_setupmenu
- send(cr$+cr$+"(E)dit (N)ext (P)revious (G)oto (Q)uit")
- getchr(ch$)
- SELECT UPPER$(ch$)
- CASE "E"
- cursor(TRUE)
- done!=FALSE
- REPEAT
- sys_setupmenu
- sys_edituser
- UNTIL done!
- cursor(FALSE)
- GOTO sysedit
- CASE "N"
- ' next
- CASE "P"
- SUB rec%,2
- IF rec%<0
- rec%=0
- ENDIF
- CASE "G"
- a$=STR$(rec%)
- send(cr$+"Goto Number? (1 - "+STR$(l%)+"):")
- input(2,5,32,a$)
- IF VAL(a$)>l%
- a$=STR$(l%)
- ELSE IF VAL(a$)<1
- a$="1"
- ENDIF
- rec%=VAL(a$)-1
- CASE "Q"
- EXIT IF TRUE
- DEFAULT
- GOTO sysedit
- ENDSELECT
- LOOP UNTIL hangup!
- local!=FALSE
- CLOSE #99
- RETURN
- > PROCEDURE sys_setupmenu
- clr
- send("Setup for user "+STR$(rec%)+" of "+STR$(l%)+cr$)
- send(cr$+"0) Name : "+t.user$)
- send(cr$+"1) Alias : "+t.alias$)
- send(cr$+"2) City : "+t.city$)
- send(cr$+"3) Password : "+t.pass$)
- send(cr$+"4) Phone : "+t.phone$)
- send(cr$+"5) Last On : "+LEFT$(t.last_time$,2)+":"+MID$(t.last_time$,3)+" "+t.last_date$)
- send(cr$+"6) Attribut : ")
- IF BTST(t.attribut|,0)
- send("CLS ")
- ENDIF
- IF BTST(t.attribut|,1)
- send("More ")
- ENDIF
- IF BTST(t.attribut|,7)
- send("Deleted")
- ENDIF
- send(cr$+"7) ScreenLenght : "+STR$(t.screenlenght|))
- flag$=BIN$(t.flags%,32)
- send(cr$+"8) Flags : ")
- send("A: "+LEFT$(flag$,8))
- send(" B: "+MID$(flag$,9,8))
- send(" C: "+MID$(flag$,17,8))
- send(" D: "+MID$(flag$,25))
- send(cr$+"9) Credits : "+STR$(t.credits&))
- send(cr$+"A) Posted Msgs : "+STR$(t.posted_msgs&))
- send(cr$+"B) Graphics : ")
- SELECT t.graphics|
- CASE 0
- send("Ascii")
- CASE 1
- send("VT52 Mono")
- CASE 2
- send("VT52 Colour")
- CASE 3
- send("VT52 Standard")
- CASE 4
- send("Ansi")
- ENDSELECT
- send(cr$+"C) Level : "+STR$(t.level|))
- send(cr$+"D) Calls : "+STR$(t.calls&))
- send(cr$+"E) Upload : "+STR$(t.uploads&)+" of "+STR$(t.upl_kb&)+"Kb")
- send(cr$+"F) Downloads : "+STR$(t.downloads&)+" of "+STR$(t.down_kb&)+"Kb")
- send(cr$+"G) LastMSG : "+STR$(t.lastmsg&))
- send(cr$+"H) LastFile : "+STR$(t.lastfile&))
- send(cr$+"I) Charset : "+STR$(t.charset|))
- send(cr$+"J) Today : "+STR$(t.down_today&)+" Kb Download, "+STR$(t.minutes_today&)+" Minutes used.")
- RETURN
- > PROCEDURE sys_edituser
- send(cr$+cr$+"(S) Save user (Q) Abort edit")
- send(cr$+"Choose 0-9 A-J S,Q >")
- CLR ch$
- menu("0123456789ABCDEFGHIJSQ"+CHR$(13),ch$)
- SELECT ch$
- CASE "0"
- clr
- send(cr$+"Please enter your full name: ")
- input(2,35,32,t.user$)
- CASE "1"
- clr
- send(cr$+"Please enter your alias: ")
- input(2,15,32,t.alias$)
- CASE "2"
- clr
- send(cr$+"Please enter City:")
- input(2,15,32,t.city$)
- CASE "3"
- clr
- send(cr$+"Please enter Password: ")
- input(3,15,32,t.pass$)
- CASE "4"
- clr
- send(cr$+"Please enter phonenumber:")
- input(1,15,32,t.phone$)
- CASE "5"
- ' laston
- a$=LEFT$(t.last_time$,2)+":"+MID$(t.last_time$,3)
- send(cr$+"Enter Lasttime (HH:MM):")
- input(1,5,32,a$)
- IF MID$(a$,3,1)=":"
- t.last_time$=LEFT$(a$,2)+RIGHT$(a$,2)
- ENDIF
- a$=t.last_date$
- send(cr$+"Enter Last Date (YYMMDD):")
- input(1,6,32,a$)
- t.last_date$=a$
- CASE "6"
- clr
- t.attribut|=0
- ' Bit 0 = CLS
- ' Bit 1 = More
- ' Bit 7 = Deleted
- clr
- CLR ch$
- send(cr$+cr$+"Do you want Clear-Screen codes to be sent (Y/n) ?")
- menu("YN"+CHR$(13),ch$)
- t.attribut|=BCLR(t.attribut|,0)
- IF ch$<>"N"
- ch$="Y"
- t.attribut|=BSET(t.attribut|,0)
- ENDIF
- send(ch$)
- CLR ch$
- send(cr$+cr$+"Do you want Pause if text is longer then screen (Y/n) ?")
- menu("YN"+CHR$(13),ch$)
- IF ch$<>"N"
- ch$="Y"
- t.attribut|=BSET(t.attribut|,1)
- ELSE
- t.attribut|=BCLR(t.attribut|,1)
- ENDIF
- send(ch$)
- CLR ch$
- send(cr$+cr$+"Delete this user (y/N) ?")
- menu("YN"+CHR$(13),ch$)
- IF ch$<>"Y"
- ch$="N"
- t.attribut|=BCLR(t.attribut|,7)
- ELSE
- t.attribut|=BSET(t.attribut|,7)
- ENDIF
- send(ch$)
- CASE "7"
- clr
- a$=STR$(t.screenlenght|)
- send(cr$+"Enter lenght of your screen (0-255):")
- input(4,3,32,a$)
- IF VAL(a$)>255
- t.screenlenght|=255
- ELSE IF VAL(a$)<=5
- t.screenlenght|=5
- ELSE
- t.screenlenght|=VAL(a$)
- ENDIF
- CASE "8"
- clr
- flag$=BIN$(t.flags%,32)
- send(cr$+" A B C D")
- send(cr$+" 12345678123456781234567812345678")
- send(cr$+"Toggle flags between 0 and 1: ")
- input(4,32,ASC("0"),flag$)
- t.flags%=VAL("&X"+flag$)
- CASE "9"
- clr
- credit$=STR$(t.credits&)
- send(cr$+"Enter Credits (0-32767):")
- input(4,5,32,credit$)
- IF VAL(credit$)>32767
- t.credits&=32767
- ELSE IF VAL(credit$)<=0
- t.credits&=0
- ELSE
- t.credits&=VAL(credit$)
- ENDIF
- CASE "A"
- clr
- a$=STR$(t.posted_msgs&)
- send(cr$+"Enter Posted Msgs (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.posted_msgs&=32767
- ELSE IF VAL(a$)<=0
- t.posted_msgs&=0
- ELSE
- t.posted_msgs&=VAL(a$)
- ENDIF
- CASE "B"
- clr
- send(cr$+"Choose some graphics:"+cr$)
- send(cr$+" 1) Ascii (Works for everyone)")
- send(cr$+" 2) VT52 mono (Atari ST Only)")
- send(cr$+" 3) VT52 color (Atari ST Only")
- send(cr$+" 4) VT52 (Standard, None Atari's VT52)")
- send(cr$+" 5) Ansi (PC Compatible graphics)")
- send(cr$+"Your choice:")
- CLR ch$
- menu("12345"+CHR$(13),ch$)
- IF VAL(ch$)>0
- t.graphics|=VAL(ch$)-1
- ELSE
- t.graphics|=0
- ENDIF
- send(ch$)
- CASE "C"
- clr
- a$=STR$(t.level|)
- send(cr$+"Enter Level (0-255):")
- input(4,3,32,a$)
- IF VAL(a$)>255
- t.level|=255
- ELSE IF VAL(a$)<=0
- t.level|=0
- ELSE
- t.level|=VAL(a$)
- ENDIF
- CASE "D"
- clr
- a$=STR$(t.calls&)
- send(cr$+"Enter Calls (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.calls&=32767
- ELSE IF VAL(a$)<=0
- t.calls&=0
- ELSE
- t.calls&=VAL(a$)
- ENDIF
- CASE "E"
- clr
- a$=STR$(t.uploads&)
- send(cr$+"Enter Number of Uploads (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.uploads&=32767
- ELSE IF VAL(a$)<=0
- t.uploads&=0
- ELSE
- t.uploads&=VAL(a$)
- ENDIF
- a$=STR$(t.upl_kb&)
- send(cr$+"Enter Uploaded KB (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.upl_kb&=32767
- ELSE IF VAL(a$)<=0
- t.upl_kb&=0
- ELSE
- t.upl_kb&=VAL(a$)
- ENDIF
- CASE "F"
- clr
- a$=STR$(t.downloads&)
- send(cr$+"Enter Number of Downloads (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.downloads&=32767
- ELSE IF VAL(a$)<=0
- t.downloads&=0
- ELSE
- t.downloads&=VAL(a$)
- ENDIF
- a$=STR$(t.down_kb&)
- send(cr$+"Enter Downloaded KB (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.down_kb&=32767
- ELSE IF VAL(a$)<=0
- t.down_kb&=0
- ELSE
- t.down_kb&=VAL(a$)
- ENDIF
- CASE "G"
- clr
- a$=STR$(t.lastmsg&)
- send(cr$+"Enter LastMSG (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.lastmsg&=32767
- ELSE IF VAL(a$)<=0
- t.lastmsg&=0
- ELSE
- t.lastmsg&=VAL(a$)
- ENDIF
- CASE "H"
- clr
- a$=STR$(t.lastfile&)
- send(cr$+"Enter Lastfile (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.lastfile&=32767
- ELSE IF VAL(a$)<=0
- t.lastfile&=0
- ELSE
- t.lastfile&=VAL(a$)
- ENDIF
- CASE "I"
- clr
- a$=STR$(t.charset|)
- send(cr$+"Enter Charset (0-255):")
- input(4,3,32,a$)
- IF VAL(a$)>255
- t.charset|=255
- ELSE IF VAL(a$)<=0
- t.charset|=0
- ELSE
- t.charset|=VAL(a$)
- ENDIF
- CASE "J"
- clr
- a$=STR$(t.down_today&)
- send(cr$+"Enter KB downloaded today (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.down_today&=32767
- ELSE IF VAL(a$)<=0
- t.down_today&=0
- ELSE
- t.down_today&=VAL(a$)
- ENDIF
- a$=STR$(t.minutes_today&)
- send(cr$+"Enter minutes used today (0-32767):")
- input(4,5,32,a$)
- IF VAL(a$)>32767
- t.minutes_today&=32767
- ELSE IF VAL(a$)<=0
- t.minutes_today&=0
- ELSE
- t.minutes_today&=VAL(a$)
- ENDIF
- CASE "S"
- ' Save
- put_t.user(99,rec%)
- done!=TRUE
- CASE "Q"
- ' Abort
- done!=TRUE
- ENDSELECT
- RETURN
- > PROCEDURE get_t.user(channel%,rec%)
- GET #channel%,rec%
- t.user$=CHAR{V:tu.user$}
- t.city$=CHAR{V:tu.city$}
- t.alias$=CHAR{V:tu.alias$}
- t.pass$=CHAR{V:tu.pass$}
- t.phone$=CHAR{V:tu.phone$}
- t.last_time$=tu.last_time$
- t.last_date$=tu.last_date$
- t.attribut|=tu.attribut|
- t.screenlenght|=tu.screenlenght|
- t.flags%=tu.flags%
- t.credits&=tu.credits&
- t.posted_msgs&=tu.posted_msgs&
- t.graphics|=tu.graphics|
- t.level|=tu.level|
- t.calls&=tu.calls&
- t.uploads&=tu.uploads&
- t.downloads&=tu.downloads&
- t.upl_kb&=tu.upl_kb&
- t.down_kb&=tu.down_kb&
- t.down_today&=tu.down_today&
- t.minutes_today&=tu.minutes_today&
- t.lastfile&=tu.lastfile&
- t.lastmsg&=tu.lastmsg&
- t.charset|=tu.charset|
- RETURN
- > PROCEDURE put_t.user(channel%,rec%)
- LSET tu.user$=t.user$+CHR$(0)
- LSET tu.city$=t.city$+CHR$(0)
- LSET tu.alias$=t.alias$+CHR$(0)
- LSET tu.pass$=t.pass$+CHR$(0)
- LSET tu.phone$=t.phone$+CHR$(0)
- LSET tu.last_time$=t.last_time$+CHR$(0)
- LSET tu.last_date$=t.last_date$+CHR$(0)
- tu.attribut|=t.attribut|
- tu.screenlenght|=t.screenlenght|
- tu.flags%=t.flags%
- tu.credits&=t.credits&
- tu.posted_msgs&=t.posted_msgs&
- tu.graphics|=t.graphics|
- tu.level|=t.level|
- tu.calls&=t.calls&
- tu.uploads&=t.uploads&
- tu.downloads&=t.downloads&
- tu.upl_kb&=t.upl_kb&
- tu.down_kb&=t.down_kb&
- tu.down_today&=t.down_today&
- tu.minutes_today&=t.minutes_today&
- tu.lastfile&=t.lastfile&
- tu.lastmsg&=t.lastmsg&
- tu.charset|=t.charset|
- PUT #channel%,rec%
- RETURN
- '
- ' --- File Editor ---
- '
- > PROCEDURE filemenu
- local!=TRUE
- l%=@init_userfile(99)
- get_user(99,1)
- CLOSE #99
- ' clr
- ' filearea
- DO
- clr
- send("1. Edit Files.dat"+cr$)
- send("2. Mark files.dat"+cr$)
- send("3. Pack Files.dat"+cr$)
- send(cr$+"Q. Quit")
- CLR ch$
- menu("123Q",ch$)
- ON VAL(ch$) GOSUB fileedit,mark_files.dat,pack_files.dat
- LOOP UNTIL ch$="Q"
- RETURN
- > PROCEDURE fileedit
- IF NOT EXIST(file_path$+"FILES.BBS")
- create_files.bbs(file_path$)
- ENDIF
- lfd%=@init_files.dat(file_path$)
- @files.dat(file_path$)
- CLOSE #16
- RETURN
- > PROCEDURE create_files.bbs(path$)
- RETURN
- > PROCEDURE files.dat(path$)
- clr
- OPEN "I",#1,file_path$+"FILES.BBS"
- REPEAT
- fexist!=FALSE
- LINE INPUT #1,a$
- IF INSTR(" -/+=",LEFT$(a$))
- ELSE
- IF LEN(a$)=0
- '
- ELSE IF INSTR(a$," ")
- file$=UPPER$(LEFT$(a$,INSTR(a$," ")-1))
- desc$=MID$(a$,INSTR(a$," ")+1)
- a$=file$+SPACE$(13-LEN(file$))
- a$=a$+" "+@files$(file_path$+file$)+desc$
- a$=@file_wrap$(a$)
- clr
- send(a$+cr$)
- FOR i%=1 TO lfd%
- get_files.dat(i%)
- exist!=(ffilename$=file$)
- EXIT IF exist!
- NEXT i%
- frec%=i%
- IF exist!
- send(cr$+"Number : "+STR$(fnumber&))
- send(cr$+"Uploader: "+fuploader$)
- send(cr$+"Counter : "+STR$(fcounter&))
- send(cr$+"Attribut: ")
- IF BTST(fdelete|,0)
- send("Deleted")
- ELSE
- send("Nothing")
- ENDIF
- send(cr$+cr$+"Change Anything? (y/N) ")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$="Y"
- change_files.dat(frec%,file$,fuploader$,fcounter&,fnumber&,fdelete|)
- ENDIF
- send(cr$+cr$)
- ELSE
- send(cr$+"Files.dat entry Doesn't exist...")
- INC fnumber&
- frec%=LOF(#16)/54+1
- change_files.dat(frec%,file$,"",0,fnumber&,FALSE)
- ENDIF
- ENDIF
- ENDIF
- UNTIL EOF(#1)
- CLOSE #1
- '
- send(cr$+cr$+"Press <RETURN>..."+CHR$(1))
- RETURN
- > PROCEDURE change_files.dat(frec%,ffilename$,fuploader$,fcounter&,fnumber&,fdelete|)
- a$=fuploader$
- IF a$=""
- a$="Sysop"
- ENDIF
- send(cr$+"Uploader: ")
- input(2,35,32,a$)
- fuploader$=a$
- '
- a$=STR$(fcounter&)
- send(cr$+"Counter : ")
- input(2,15,32,a$)
- IF VAL(a$)>32767
- a$="32767"
- ELSE IF VAL(a$)<0
- a$="0"
- ENDIF
- fcounter&=VAL(a$)
- '
- CLR ch$
- send(cr$+cr$+"Delete (y/N) ?")
- menu("YN"+CHR$(13),ch$)
- fdelete|=0
- IF ch$="Y"
- fdelete|=BSET(fdelete|,0)
- ENDIF
- send(ch$+cr$)
- '
- put_files.dat(frec%)
- RETURN
- > PROCEDURE get_files.dat(frec%)
- IF LOF(#16)
- GET #16,frec%
- fuploader$=CHAR{V:f.fuploader$}
- ffilename$=CHAR{V:f.ffilename$}
- fcounter&=f.fcounter&
- fnumber&=f.fnumber&
- fdelete|=f.fdelete|
- ENDIF
- RETURN
- > PROCEDURE put_files.dat(frec%)
- LSET f.fuploader$=fuploader$+CHR$(0)
- LSET f.ffilename$=ffilename$+CHR$(0)
- f.fcounter&=fcounter&
- f.fnumber&=fnumber&
- f.fdelete|=fdelete|
- PUT #16,frec%
- RETURN
- '
- > PROCEDURE mark_files.dat
- clr
- '
- lfd%=@init_files.dat(file_path$)
- '
- FOR i%=1 TO lfd%
- get_files.dat(i%)
- exist!=EXIST(file_path$+ffilename$)
- IF BTST(fdelete|,0)
- send("Deleted: "+STR$(fnumber&)+". ")
- send(ffilename$+", ")
- send(fuploader$+".")
- IF exist!
- send(" EXISTING FILE!!!")
- ENDIF
- ELSE
- send("Active : "+STR$(fnumber&)+". ")
- send(ffilename$+", ")
- send(fuploader$+".")
- IF NOT exist!
- send(" NONE EXISTING FILE!!!")
- ENDIF
- ENDIF
- CLR ch$
- menu("DU"+CHR$(13),ch$)
- IF ch$="D"
- fdelete|=BSET(fdelete|,0)
- send(" p Delete q"+cr$)
- ELSE IF ch$="U"
- fdelete|=BCLR(fdelete|,0)
- send(" p Undelete q"+cr$)
- ELSE
- send(cr$)
- ENDIF
- put_files.dat(i%)
- '
- NEXT i%
- CLOSE #16
- RETURN
- > PROCEDURE pack_files.dat
- LOCAL tmp.fuploader$,tmp.ffilename$,tmp.fcounter&
- LOCAL tmp.fnumber&,tmp.fdelete|
- '
- clr
- '
- lfd%=@init_files.dat(file_path$)
- '
- IF EXIST(file_path$+"FILES.TMP")
- KILL file_path$+"FILES.TMP"
- ENDIF
- OPEN "R",#17,file_path$+"FILES.TMP",54
- FIELD #17,36 AS tmp.fuploader$,13 AS tmp.ffilename$,2 AT(*tmp.fcounter&)
- FIELD #17,2 AT(*tmp.fnumber&),1 AT(*tmp.fdelete|)
- '
- FOR i%=1 TO lfd%
- get_files.dat(i%)
- exist!=EXIST(file_path$+ffilename$)
- IF BTST(fdelete|,0)
- send("Delete: "+STR$(fnumber&)+". ")
- send(ffilename$+", ")
- send(fuploader$+".")
- IF exist!
- send(" EXISTING FILE!!!"+cr$)
- ELSE
- send(cr$)
- ENDIF
- ELSE
- send("Keep : "+STR$(fnumber&)+". ")
- send(ffilename$+", ")
- send(fuploader$+".")
- IF exist!
- send(cr$)
- ELSE
- send(" NONE EXISTING FILE!!!"+cr$)
- ENDIF
- LSET tmp.fuploader$=fuploader$+CHR$(0)
- LSET tmp.ffilename$=ffilename$+CHR$(0)
- tmp.fcounter&=fcounter&
- tmp.fnumber&=fnumber&
- tmp.fdelete|=fdelete|
- PUT #17
- ENDIF
- NEXT i%
- CLOSE #16
- CLOSE #17
- IF EXIST(file_path$+"F_DAT.BAK")
- KILL file_path$+"F_DAT.BAK"
- ENDIF
- NAME file_path$+"FILES.DAT" AS file_path$+"F_DAT.BAK"
- NAME file_path$+"FILES.TMP" AS file_path$+"FILES.DAT"
- RETURN
- '
- ' --- Menu Editor ---
- '
- > PROCEDURE menueditor
- LOCAL a$,m.string$,e%,a|
- '
- DO
- ~FSETDTA(BASEPAGE+128)
- e%=FSFIRST(menu_path$+"*.MNU",-1)
- m.string$=""
- DO UNTIL e%
- a|=PEEK(BASEPAGE+128+21) !Attribut
- IF (NOT BTST(a|,1)) AND (NOT BTST(a|,2)) AND (NOT BTST(a|,3)) AND (NOT BTST(a|,4))
- a$=CHAR{BASEPAGE+158}
- m.string$=m.string$+LEFT$(a$,INSTR(a$,".")-1)+", "
- ENDIF
- e%=FSNEXT()
- LOOP
- m.string$=LEFT$(m.string$,LEN(m.string$)-2)+"."
- wrap(m.string$)
- clr
- send("Menus on disk:"+cr$)
- send(cr$+m.string$)
- send(cr$+cr$+"(E)dit menu (Q)uit")
- CLR ch$
- menu("EQ",ch$)
- IF ch$="E"
- m.get_name
- ENDIF
- LOOP UNTIL ch$="Q"
- RETURN
- > PROCEDURE m.get_name
- send(cr$+"Please name of menu you want to edit: ")
- CLR m.name$
- input(2,8,32,m.name$)
- IF LEN(m.name$)
- IF EXIST(menu_path$+m.name$+".MNU")
- m.edit(m.name$,TRUE)
- ELSE
- send(cr$+m.name$+" doesn't exist, create? (y/N)")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$="Y"
- m.edit(menu_path$+m.name$+".MNU",FALSE)
- ENDIF
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE m.edit(m.namn$,exist!)
- IF exist!
- @load_menu(m.namn$,"")
- ELSE
- m%=0
- ENDIF
- DO
- clr
- send("Name: "+m.namn$+", "+STR$(m%)+" entries")
- send(cr$+cr$+"(S)imulate, (P)rompt, (Q)uit")
- CLR ch$
- menu("SQ",ch$)
- IF ch$="S"
- simulate_menu(255)
- send(cr$+cr$+"Simulation done, Press RETURN..."+CHR$(1))
- ELSE IF ch$="P"
- ENDIF
- LOOP UNTIL ch$="Q"
- CLR ch$
- RETURN
- > PROCEDURE simulate_menu(sec|)
- IF NOT hangup!
- CLR ch$
- clr
- FOR i%=0 TO m%
- IF sec|=>m.level|(i%)
- IF i%>0
- IF UPPER$(LEFT$(m.text$(i%-1),2))<>"-N"
- send(SPACE$(2-LEN(STR$(i%)))+STR$(i%)+":")
- ENDIF
- ELSE
- send(" 0:")
- ENDIF
- IF UPPER$(LEFT$(m.text$(i%),2))="-N"
- send(MID$(m.text$(i%),3))
- ELSE
- send(m.text$(i%)+cr$)
- ENDIF
- ENDIF
- '
- EXIT IF hangup!
- NEXT i%
- send("Pr:"+prompt$)
- ENDIF
- RETURN
- '
- ' -------------------------------------------
- '
- > PROCEDURE login(login|)
- LOCAL l.date$
- send(cr$+"SCS BBS "+version$+" beta, (C) 1991 Jan Leveren"+cr$+cr$)
- cat("LOGO.ASC","","")
- clear_rs
- DO WHILE login|=0
- REPEAT
- username("Username:",user$)
- user$=TRIM$(user$)
- UNTIL hangup! OR LEN(user$)
- EXIT IF hangup!
- log(user$+" online in "+baud$+" baud")
- rec%=FN newuser(user$)
- EXIT IF rec%>0
- CLOSE #99
- send(cr$+"You entered "+user$+", Correct (Y/n) ?")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- LOOP UNTIL hangup! OR ch$<>"N"
- '
- IF NOT hangup!
- IF rec%>0
- get_user(99,rec%)
- INC calls&
- last_time$=LEFT$(TIME$,2)+MID$(TIME$,4,2)
- l.date$=RIGHT$(DATE$,2)+MID$(DATE$,4,2)+LEFT$(DATE$,2)
- IF l.date$<>last_date$
- last_date$=l.date$
- LET down_today&=0
- LET minutes_today&=0
- ENDIF
- put_user(99,rec%)
- CLOSE #99
- IF login|=0
- password("Password:",FALSE)
- ELSE
- hangup!=FALSE
- IF LEN(alias$)
- send("Hi "+alias$+"!")
- ELSE
- send("Hi "+user$+"!")
- ENDIF
- ENDIF
- log(user$+" ("+alias$+") online")
- ELSE
- questions
- ENDIF
- '
- IF NOT hangup!
- cat("WELCOME.ASC","P","S")
- cat("NEWS.ASC","P","S")
- clr
- checkmsgs
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE logoff !Last
- IF NOT hangup!
- cat("GOODBYE.ASC","P","S")
- hangup!=TRUE
- ENDIF
- RETURN
- > PROCEDURE after_bbs !Logging, Listmaking etc
- PRINT
- @modem_stat
- IF (NOT dcd!) AND (NOT local!)
- log("Dropped Carrier"+cr$)
- IF rec%>0
- last_err$=user$+" dropped carrier"
- ELSE
- last_err$="Unknown dropped carrier"
- ENDIF
- s.dc!=TRUE
- ELSE
- log("Legal Log out"+cr$)
- ENDIF
- PRINT " o Hanging up..."
- modem(m.hangup$)
- '
- IF rec%>0
- ~@init_userfile(99)
- put_user(99,rec%)
- CLOSE #99
- IF rec%>1
- statusline
- ENDIF
- ENDIF
- RETURN
- '
- ' -----------------------------------------< Menus
- > PROCEDURE mainmenu(m.menu$,m.param$)
- WHILE NOT hangup!
- @load_menu(m.menu$,m.param$)
- show_menu
- m.tolk
- WEND
- RETURN
- > PROCEDURE load_menu(m.menu$,m.param$) !Under Construction
- ERASE m.text$(),m.param$(),m.type|(),m.cost&(),m.level|(),m.flags%(),m.fc|(),m.bc|()
- DIM m.text$(50),m.param$(50),m.type|(50),m.cost&(50),m.level|(50),m.flags%(50),m.fc|(50),m.bc|(50)
- CLOSE #32
- IF NOT hangup!
- IF EXIST(menu_path$+m.menu$)
- OPEN "I",#32,menu_path$+m.menu$
- ELSE IF EXIST(menu_path$+m.menu$+".MNU")
- OPEN "I",#32,menu_path$+m.menu$+".MNU"
- ELSE
- send(cr$+UPPER$(m.menu$)+" Menu not found.")
- send(cr$+"Sysop Error, Returning to TOP menu.")
- last_err$="Menu "+m.menu$+" not found"
- mainmenu("TOP","")
- ENDIF
- LINE INPUT #32,prompt$
- m%=0
- m.key$=""
- key$=""
- DO WHILE NOT EOF(#32)
- LINE INPUT #32,m.text$(m%)
- LINE INPUT #32,m.param$(m%)
- LINE INPUT #32,m.data$
- IF LEN(m.data$) AND ((VAL(m.data$)=>0 AND LEFT$(m.data$)<>","))
- key$=LEFT$(m.data$)
- ELSE
- key$=CHR$(0)
- ENDIF
- m.data$=@komma$(m.data$)
- m.type|(m%)=VAL(m.data$)
- m.data$=@komma$(m.data$)
- m.cost&(m%)=VAL(m.data$)
- m.data$=@komma$(m.data$)
- m.level|(m%)=VAL(m.data$)
- m.data$=@komma$(m.data$)
- m.flags%(m%)=VAL(m.data$)
- m.data$=@komma$(m.data$)
- m.fc|(m%)=VAL(m.data$)
- m.data$=@komma$(m.data$)
- m.bc|(m%)=VAL(m.data$)
- IF level|=>m.level|(m%)
- m.key$=m.key$+key$
- ELSE
- m.key$=m.key$+CHR$(0)
- ENDIF
- INC m%
- EXIT IF LOF(#32)-LOC(#32)<3
- LOOP UNTIL EOF(#32)
- CLOSE #32
- ENDIF
- RETURN
- > PROCEDURE show_menu
- IF NOT hangup!
- reverse!=TRUE
- reverse
- CLR ch$
- clr
- FOR menu%=0 TO m%
- IF level|=>m.level|(menu%)
- IF INSTR(m.text$(menu%),"~")
- tls%=INSTR(m.text$(menu%),"~")
- IF LEN(m.text$(menu%))>1
- m.text$(menu%)=LEFT$(m.text$(menu%),tls%-1)+STR$(@timeleft)+MID$(m.text$(menu%),tls%+1)
- ELSE
- m.text$(menu%)=STR$(@timeleft)
- ENDIF
- ENDIF
- IF UPPER$(LEFT$(m.text$(menu%),2))="-N"
- send(MID$(m.text$(menu%),3))
- ELSE
- send(m.text$(menu%)+cr$)
- ENDIF
- ENDIF
- '
- IF INP?(1) OR INP?(2)
- getchr(ch$)
- ENDIF
- EXIT IF INSTR(m.key$,ch$) OR hangup!
- NEXT menu%
- IF INSTR(prompt$,"~")
- tls%=INSTR(prompt$,"~")
- IF LEN(prompt$)>1
- prompt$=LEFT$(prompt$,tls%-1)+STR$(@timeleft)+MID$(prompt$,tls%+1)
- ELSE
- prompt$=STR$(@timeleft)
- ENDIF
- ENDIF
- send(prompt$)
- ENDIF
- RETURN
- > PROCEDURE m.tolk
- menu(m.key$,ch$)
- send(ch$)
- m.val|=INSTR(m.key$,ch$)-1
- SELECT m.type|(m.val|)
- CASE 0
- ' TEXT LINE
- CASE 1
- split(m.param$(m.val|))
- mainmenu(part1$,part2$)
- CASE 2
- ' gosub menu
- CASE 3
- ' return from gosub
- CASE 4
- ' clear stack and goto new menu
- CASE 5
- clr
- cat(m.param$(m.val|)," P","S"+CHR$(3))
- CASE 7
- execute(m.param$(m.val|))
- CASE 8
- version
- CASE 9
- logoff
- CASE 10
- ' display graph
- CASE 11
- ' play("",m.param$(m.val|))
- yell(m.param$(m.val|))
- CASE 13
- ' list users
- CASE 14
- ' display stats
- CASE 15
- ' exit with error level
- CASE 16
- setupmenu
- CASE 22
- ' check for mail
- checkmsgs
- CASE 23
- ' read mail
- @readmsg(VAL(m.param$(m.val|)))
- CASE 25
- ' quickscan
- quickscan(VAL(m.param$(m.val|)))
- CASE 27
- ' write mail
- @writemsg(VAL(m.param$(m.val|)),"","")
- CASE 30
- ' raw dir
- rawdir(m.param$(m.val|))
- CASE 31
- ' Display file-list
- @files.bbs(m.param$(m.val|))
- CASE 32
- ' download
- @download(m.param$(m.val|),"","")
- CASE 33
- ' upload
- @upload(m.param$(m.val|))
- CASE 34
- ' list arcive
- CASE 35
- ' search
- CASE 36
- ' Long List
- ' long_list
- CASE 37
- ' new files
- CASE 38
- ' read text-file
- CASE 39
- ' display file (full path)
- CASE 40
- ' replace menutext
- CASE 41
- ' Toggle FSE
- CASE 45
- ' display text + press return
- clr
- cat(m.param$(m.val|)," P","S"+CHR$(3))
- send(cr$+"Press <RETURN>..."+CHR$(1))
- CASE 80
- ' Online Arciver
- CASE 81
- ' pump file
- CASE 83
- ' file browser
- DEFAULT
- PRINT "Unknown option...."
- PRINT
- PRINT "Keys '";m.key$;"'";LEN(m.key$)
- PRINT "Key '";ch$;"'"
- PRINT "Type ";m.type|(m.val|)
- PRINT "Cost ";m.cost&(m.val|)
- PRINT "Level ";m.level|(m.val|)
- PRINT "Flags ";m.flags%(m.val|)
- PRINT "FCol ";m.fc|(m.val|);""
- PRINT "BCol ";m.bc|(m.val|)
- PRINT "M Data '";m.param$(m.val|);"'"
- PRINT "M Text '";m.text$(m.val|);"'"
- REPEAT
- UNTIL INP?(1) OR INP?(2)
- ENDSELECT
- RETURN
- '
- ' ------------------------------------------
- '
- > PROCEDURE yell(a$)
- s.yell!=TRUE
- send(cr$+""+a$)
- FOR i%=1 TO 4
- SETCOLOR 0,c&
- c&=ABS(NOT c&)
- PAUSE 20
- NEXT i%
- send(cr$+"I've send signal to SysOp, maybe he will break in if he can chat...")
- getchr(ch$)
- RETURN
- '
- '
- > PROCEDURE version !Menu 8
- clr
- send("SCS BBS "+version$)
- send(cr$+cr$+"Based on DemoBBS, written by Jens Bauer, 1989.")
- send(cr$+"Modified and extended by Jan Leveren, 1991.")
- send(cr$+"Programmed in GFA 3.5.")
- send(cr$+cr$+"Press <RETURN>"+CHR$(1))
- RETURN
- '
- ' ----
- ' Users Setup, first and following
- '
- > PROCEDURE questions !New User Questions
- attribut|=BSET(attribut|,0)
- clr
- '
- clear_rs
- DO
- send(cr$+"Do you wish to register as a user in Suffer City (y/n) ?")
- CLR ch$
- menu("YN",ch$)
- LOOP UNTIL hangup! OR (ch$="Y" OR ch$="N")
- IF ch$="N"
- send("Ok, Bye...")
- rec%=0
- hangup!=TRUE
- ENDIF
- '
- IF NOT hangup!
- DO ! stop= ESC or ctrl-C
- REPEAT
- clr
- send("You may enter an alias later, now i want your real name.")
- send(cr$+cr$+"Is "+user$+" your full and real name (y/N) ?")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$<>"Y"
- name
- ENDIF
- UNTIL LEN(user$) AND ch$="Y"
- IF @newuser(user$)>0
- send(cr$+"You are allready registred as a user here!")
- send(cr$+"Please call again and login as "+user$+".")
- send(cr$+cr$+"Bye!")
- hangup!=TRUE
- PAUSE 50
- EXIT IF TRUE
- ENDIF
- CLOSE #99
- LOOP UNTIL hangup! OR ch$<>"N"
- ENDIF
- '
- IF NOT hangup!
- calls&=1
- last_time$=LEFT$(TIME$,2)+MID$(TIME$,4,2)
- last_date$=RIGHT$(DATE$,2)+MID$(DATE$,4,2)+LEFT$(DATE$,2)
- lastmsg&=1
- lastfile&=1
- posted_msgs&=0
- uploads&=0
- LET downloads&=0
- upl_kb&=0
- LET down_kb&=0
- LET down_today&=0
- CLR city$
- CLR phone$
- '
- credits&=newusercredits&
- flags%=newuserflags%
- level|=newuserlevel|
- '
- l%=@init_userfile(99)
- '
- log("New user: "+user$)
- '
- clr
- send$="Hi, "+alias$+"! I see that you are a new user. You must now choose a Password."
- send$=send$+"A password must be between 4 and 15 letters."
- send$=send$+"You will be asked to enter it twice, just so we can be shore."
- wrap(send$) ! makes wordwrap.
- send(cr$+send$) ! Send wrapped text.
- send(cr$+"Press <RETURN>..."+CHR$(1))
- CLR pass$,alias$
- pass
- IF password$=pass$
- graphics
- '
- attribut
- '
- screenl
- '
- city
- '
- phone
- '
- rec%=l%+1
- put_user(99,rec%)
- CLOSE #99
- ELSE
- send(cr$+"Sorry I have to log you off, call back sometime.")
- rec%=0
- hangup!=TRUE
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE username(prompt$,VAR user$) !Ask Username
- send(cr$+prompt$)
- cursor(TRUE)
- CLR user$
- input(2,35,32,user$)
- user$=TRIM$(user$)
- IF NOT hangup!
- IF INSTR(user$," ")
- alias$=LEFT$(user$,INSTR(user$," ")-1)
- lastname$=MID$(user$,INSTR(user$," ")+1)
- get_name!=FALSE
- ELSE
- alias$=name$
- CLR lastname$
- get_name!=TRUE
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE password(prompt$,new!) !Ask Password
- LOCAL tries|
- CLR password$
- REPEAT
- send(cr$+prompt$)
- cursor(TRUE)
- input(0,15,32,password$)
- INC tries|
- IF NOT new!
- IF password$<>pass$
- PRINT
- PRINT " o Wrong password: ";password$;"<>";pass$
- send(cr$+"Invalid password.")
- IF tries|>3
- send(cr$+"Failed Logon. Bye "+user$+".")
- hangup!=TRUE
- ELSE
- send(" No, that's not it...")
- ENDIF
- ENDIF
- ELSE
- IF LEN(password$)<4
- IF tries#<4
- send(cr$+"A password must be MORE than 3 letters, please try again.")
- ELSE
- send(cr$+"Too many errors writing password. Bye "+user$+".")
- hangup!=TRUE
- ENDIF
- ENDIF
- ENDIF
- EXIT IF hangup!
- UNTIL (LEN(password$)>3 AND new!) OR (pass$=password$ AND NOT new!)
- RETURN
- '
- > PROCEDURE setupmenu !Menu 16
- LET quit!=FALSE
- l%=@init_userfile(99)
- put_user(99,rec%)
- DO
- clr
- send("Setup for "+user$+cr$)
- send(cr$+"A) Alias : "+alias$)
- send(cr$+"C) City : "+city$)
- send(cr$+"P) Password : "+"<Hidden>") !pass$
- send(cr$+"T) Phone : "+phone$)
- send(cr$+"G) Graphics : ")
- SELECT graphics|
- CASE 0
- send("Ascii")
- CASE 1
- send("VT52 Mono")
- CASE 2
- send("VT52 Colour")
- CASE 3
- send("VT52 Standard")
- CASE 4
- send("Ansi")
- ENDSELECT
- send(cr$+"B) Attribut : ")
- IF BTST(attribut|,0)
- send("CLS ")
- ENDIF
- IF BTST(attribut|,1)
- send("More ")
- ENDIF
- IF BTST(attribut|,7)
- send("Deleted")
- ENDIF
- send(cr$+"L) Lenght of Screen: "+STR$(screenlenght|))
- send(cr$+"H) Charset : ")
- SELECT charset|
- CASE 0
- send("7 Bit Ascii")
- CASE 1
- send("PC8")
- CASE 2
- send("Iso 151")
- DEFAULT
- send("Unknown")
- ENDSELECT
- send(cr$+cr$+"S) Save and Quit")
- send(cr$+"Q) Quit")
- send(cr$+">")
- CLR ch$
- menu("ACPTGBLHSQ"+CHR$(13),ch$)
- ON INSTR("ACPTGBLHSQ",ch$) GOSUB alias,city,pass,phone,graphics,attribut,screenl,charset,save,quit
- EXIT IF quit! OR hangup!
- LOOP
- CLOSE #99
- RETURN
- > PROCEDURE name
- clr
- send(cr$+"Please enter your full name: ")
- input(2,35,32,user$)
- RETURN
- > PROCEDURE alias
- clr
- send(cr$+"Please enter your alias: ")
- input(2,15,32,alias$)
- IF LEN(alias$)
- IF @newuser(alias$)>0
- send(cr$+"Sorry but "+alias$+" is allready taken")
- send(cr$+"You have to choose again...")
- send(cr$+cr$+"Press ANY key")
- getchr(ch$)
- CLR alias$
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE pass
- LOCAL oldpass$
- clr
- oldpass$=pass$
- CLR tries|
- REPEAT
- password(cr$+cr$+"Choose your password:",TRUE)
- pass$=password$
- password$=""
- password(" And again:",TRUE)
- IF pass$<>password$
- PRINT pass$;"<>";password$
- send(cr$+"The passwords didn't match.")
- IF tries|<4
- INC tries#
- send(" Please try again")
- ENDIF
- ENDIF
- UNTIL password$=pass$ OR tries|>3
- IF tries|>3
- pass$=oldpass$
- ENDIF
- RETURN
- > PROCEDURE graphics
- clr
- send("Choose some graphics:"+cr$)
- send(cr$+" 1) Ascii (Works for everyone)") ! Tab runs faster
- send(cr$+" 2) VT52 mono (Atari ST Only)")
- send(cr$+" 3) VT52 color (Atari ST Only")
- send(cr$+" 4) VT52 (Standard, None Atari's VT52)")
- send(cr$+" 5) Ansi (PC Compatible graphics)")
- send(cr$+"Your choice:")
- CLR ch$
- menu("12345"+CHR$(13),ch$)
- IF VAL(ch$)>0
- graphics|=VAL(ch$)-1
- ELSE
- graphics|=0
- ENDIF
- send(ch$)
- RETURN
- > PROCEDURE attribut
- clr
- attribut|=0
- ' Bit 0 = CLS
- ' Bit 1 = More
- ' Bit 7 = Deleted
- clr
- CLR ch$
- send(cr$+cr$+"Do you want Clear-Screen codes to be sent (Y/n) ?")
- menu("YN"+CHR$(13),ch$)
- attribut|=BCLR(attribut|,0)
- IF ch$<>"N"
- ch$="Y"
- attribut|=BSET(attribut|,0)
- ENDIF
- send(ch$)
- CLR ch$
- send(cr$+cr$+"Do you want Pause if text is longer then screen (Y/n) ?")
- menu("YN"+CHR$(13),ch$)
- IF ch$<>"N"
- ch$="Y"
- attribut|=BSET(attribut|,1)
- ELSE
- attribut|=BCLR(attribut|,1)
- ENDIF
- send(ch$)
- RETURN
- > PROCEDURE city
- clr
- send(cr$+"Where do you live? (City):")
- input(2,15,32,city$)
- RETURN
- > PROCEDURE phone
- clr
- send(cr$+"And your phonenumber:")
- input(1,15,32,phone$)
- RETURN
- > PROCEDURE screenl
- clr
- IF screenlenght|
- screenlenght$=STR$(screenlenght|)
- ELSE
- screenlenght$="24"
- ENDIF
- send(cr$+"Enter lenght of your screen (5-255):")
- input(4,3,32,screenlenght$)
- IF VAL(screenlenght$)>255
- screenlenght|=255
- ELSE IF VAL(screenlenght$)<=5
- screenlenght|=5
- ELSE
- screenlenght|=VAL(screenlenght$)
- ENDIF
- RETURN
- > PROCEDURE charset
- clr
- send("Choose a Charset:"+cr$)
- send(cr$+" 1) 7 bit Ascii (Standard, Doesn't use ASCII above 127)")
- send(cr$+" 2) PC8 (Standard on ST without Keyboard-Programs)")
- send(cr$+" 3) ISO 151 (Amiga uses this)")
- send(cr$+cr$+"Your choice:")
- CLR ch$
- menu("12345"+CHR$(13),ch$)
- IF VAL(ch$)>0
- charset|=VAL(ch$)-1
- ELSE
- charset|=0
- ENDIF
- send(ch$)
- RETURN
- '
- > PROCEDURE save
- LET quit!=TRUE
- put_user(99,rec%)
- CLOSE #99
- RETURN
- > PROCEDURE quit
- LET quit!=TRUE
- get_user(99,rec%)
- CLOSE #99
- RETURN
- ' ----
- '
- ' Read and write users in userfile
- '
- > PROCEDURE get_user(channel%,rec%) !Read 1 user
- GET #channel%,rec%
- user$=CHAR{V:u.user$}
- city$=CHAR{V:u.city$}
- alias$=CHAR{V:u.alias$}
- pass$=CHAR{V:u.pass$}
- phone$=CHAR{V:u.phone$}
- last_time$=u.last_time$
- last_date$=u.last_date$
- attribut|=u.attribut|
- screenlenght|=u.screenlenght|
- flags%=u.flags%
- credits&=u.credits&
- posted_msgs&=u.posted_msgs&
- graphics|=u.graphics|
- level|=u.level|
- calls&=u.calls&
- uploads&=u.uploads&
- LET downloads&=u.downloads&
- upl_kb&=u.upl_kb&
- LET down_kb&=u.down_kb&
- LET down_today&=u.down_today&
- minutes_today&=u.minutes_today&
- lastfile&=u.lastfile&
- lastmsg&=u.lastmsg&
- charset|=u.charset|
- RETURN
- > PROCEDURE put_user(channel%,rec%) !Write 1 user
- LSET u.user$=user$+CHR$(0)
- LSET u.city$=city$+CHR$(0)
- LSET u.alias$=alias$+CHR$(0)
- LSET u.pass$=pass$+CHR$(0)
- LSET u.phone$=phone$+CHR$(0)
- LSET u.last_time$=last_time$+CHR$(0)
- LSET u.last_date$=last_date$+CHR$(0)
- u.attribut|=attribut|
- u.screenlenght|=screenlenght|
- u.flags%=flags%
- u.credits&=credits&
- u.posted_msgs&=posted_msgs&
- u.graphics|=graphics|
- u.level|=level|
- u.calls&=calls&
- u.uploads&=uploads&
- u.downloads&=downloads&
- u.upl_kb&=upl_kb&
- u.down_kb&=down_kb&
- u.down_today&=down_today&
- u.minutes_today&=minutes_today&
- u.lastfile&=lastfile&
- u.lastmsg&=lastmsg&
- u.charset|=charset|
- PUT #channel%,rec%
- RETURN
- '
- ' -----------------------------------------< File Functions
- '
- > PROCEDURE files.bbs(file_path$) !Menu 37
- clr
- IF EXIST(file_path$+"FILES.BBS")
- OPEN "I",#1,file_path$+"FILES.BBS"
- lfd%=@init_files.dat(file_path$)
- REPEAT
- LINE INPUT #1,a$
- IF INSTR(" -/+=",LEFT$(a$))
- ELSE
- IF LEN(a$)=0
- '
- ELSE IF INSTR(a$," ")
- file$=UPPER$(LEFT$(a$,INSTR(a$," ")-1))
- desc$=MID$(a$,INSTR(a$," ")+1)
- a$=file$+SPACE$(13-LEN(file$))
- a$=a$+" "+@files$(file_path$+file$)+desc$
- a$=@file_wrap$(a$)
- ENDIF
- ENDIF
- send(a$+cr$)
- UNTIL EOF(#1)
- CLOSE #1
- CLOSE #16
- ENDIF
- '
- send(cr$+cr$+"Press <RETURN>..."+CHR$(1))
- RETURN
- > PROCEDURE long_list !Menu 36
- clr
- OPEN "I",#1,file_path$+"FILES.BBS"
- lfd%=@init_files.dat(file_path$)
- IF lfd%=1
- send(cr$+"1 file, <Return>=lastfile, start with:")
- ELSE
- send(cr$+STR$(lfd%)+" files, <Return>=lastfile, start with:")
- ENDIF
- CLR inp$
- input(1,5,32,inp$)
- IF inp$=""
- f%=lastfile&
- ELSE
- f%=VAL(inp$)
- ENDIF
- IF f%<1
- f%=1
- ELSE IF f%>lfd%
- f%=lfd%
- ENDIF
- clr
- FOR file%=f% TO lfd%
- get_files.dat(file%)
- IF BTST(fdelete|,0)=FALSE
- SEEK #1,1
- REPEAT
- a$=""
- file$=""
- desc$=""
- found!=FALSE
- LINE INPUT #1,a$
- IF INSTR(a$," ")
- file$=UPPER$(LEFT$(a$,INSTR(a$," ")-1))
- IF file$=ffilename$
- desc$=MID$(a$,INSTR(a$," ")+1)
- a$=file$+SPACE$(13-LEN(file$))
- a$=a$+" "+@files$(file_path$+file$)
- send(cr$+STR$(file%)+". "+a$+cr$)
- send("Uploader: "+fuploader$+cr$)
- wrap(desc$)
- send(desc$+cr$)
- found!=TRUE
- EXIT IF TRUE
- ENDIF
- ENDIF
- UNTIL EOF(#1)
- IF found!=TRUE
- send("(N)ext, (D)ownload, (Q)uit")
- CLR ch$
- menu("NDQ"+CHR$(13),ch$)
- IF ch$="N" OR ch$=CHR$(13)
- send(cr$)
- ELSE IF ch$="D"
- download(file_path$,ffilename$,"")
- ELSE IF ch$="Q"
- EXIT IF TRUE
- ENDIF
- ENDIF
- ENDIF
- NEXT file%
- DEC file%
- CLOSE #1
- CLOSE #16
- IF file%>lastfile&
- lastfile&=file%
- ENDIF
- '
- RETURN
- > PROCEDURE rawdir(file_path$) !Menu 30
- clr
- send("Please enter filespec's: ")
- file$="*.*"
- input(3,12,32,file$)
- @dir(file_path$+file$)
- send(cr$+cr$+"Press <RETURN>"+CHR$(1))
- RETURN
- > PROCEDURE download(file_path$,file$,pro$)!Menu 32
- LOCAL oldbaud%
- proto!=TRUE
- IF LEN(pro$)=0
- clr
- send("Please choose protokoll:"+cr$)
- send(cr$+" X) Xmodem")
- send(cr$+" K) Xmodem 1K")
- send(cr$+" Y) Ymodem")
- send(cr$+" Z) Zmodem")
- send(cr$+" Q) Quit")
- send(cr$+cr$+"Your choice:")
- CLR ch$
- menu("XKYZQ"+CHR$(13),ch$)
- ELSE
- ch$=pro$
- ENDIF
- SELECT ch$
- CASE "X"
- send("Xmodem")
- batch!=FALSE
- CASE "K"
- send("Xmodem 1K")
- batch!=FALSE
- CASE "Y"
- send("Ymodem")
- batch!=TRUE
- CASE "Z"
- send("Zmodem")
- batch!=TRUE
- DEFAULT
- send("Quit")
- proto!=FALSE
- ENDSELECT
- IF proto! AND NOT hangup!
- IF LEN(file$)=0
- clr
- IF batch!=TRUE
- send(cr$+"Please enter file('s) Wildcards are valid: ")
- input(3,80,32,file$)
- ELSE
- send(cr$+"Please enter file: ")
- input(3,12,32,file$)
- ENDIF
- ENDIF
- '
- fil$=""
- f$=file$
- size%=0
- DO
- IF INSTR(f$," ")
- a$=TRIM$(LEFT$(f$,INSTR(f$," ")))
- f$=TRIM$(MID$(f$,INSTR(f$," ")))
- ELSE
- a$=f$
- f$=""
- ENDIF
- a$=@find_file$(file_path$+a$,batch!)
- size%=size%+VAL(a$)
- fil$=fil$+MID$(a$,VAL?(a$)+1)
- LOOP WHILE LEN(f$)>0
- oldbaud%=VAL(baud$)
- SELECT oldbaud%
- CASE 300
- bpm%=37.5
- CASE 1200
- bpm%=150
- CASE 2400
- bpm%=300
- CASE 9600
- bpm%=1400
- CASE 19200
- bpm%=1750
- DEFAULT
- bpm%=1400
- ENDSELECT
- need%=INT(((size%/bpm%)/60)+0.5)
- '
- IF ch$="X"
- split(x_down$)
- ELSE IF ch$="K"
- split(k_down$)
- ELSE IF ch$="Y"
- split(y_down$)
- ELSE IF ch$="Z"
- split(z_down$)
- ENDIF
- IF LEN(TRIM$(fil$))
- clr
- t.fil$="Ready to send:"+fil$
- wrap(t.fil$)
- send(t.fil$+cr$)
- send("Size: "+STR$(size%)+" Bytes, Time Needed: "+STR$(need%)+" minutes."+cr$)
- send("Please prepare to recive file(s)"+cr$)
- part2$=part2$+" "+file$
- old_dir$=@cwd$
- ~@chd(file_path$)
- e%=@run(part1$,part2$)
- ~@chd(old_dir$)
- log("Downloaded "+file$+" using "+ch$+", Return "+STR$(e%))
- clear_rs
- IF e%=0
- send(cr$+cr$+"Transfer completed!")
- lfd%=@init_files.dat(file_path$)
- ~@update_fcount(fil$)
- CLOSE #16
- ADD down_kb&,INT(size%/1024)
- ADD down_today&,INT(size%/1024)
- ELSE IF e%=3
- send(cr$+cr$+"Transfer Aborted!")
- ELSE
- last_err$="Error "+STR$(e%)+" from Download-protokoll ("+ch$+")."
- send(cr$+cr$+"Error "+STR$(e%)+" from protokoll.")
- ENDIF
- send(cr$+cr$+"Press <RETURN>..."+CHR$(1))
- ELSE
- send(cr$+cr$+"File(s) not found!")
- send(cr$+cr$+"Press <RETURN>..."+CHR$(1))
- ENDIF
- ENDIF
- CLR ch$
- RETURN
- > PROCEDURE upload(file_path$) !Menu 33
- LOCAL file$
- proto!=TRUE
- clr
- send("Please choose protokoll:"+cr$)
- send(cr$+" X) Xmodem")
- send(cr$+" K) Xmodem 1K")
- send(cr$+" Y) Ymodem")
- send(cr$+" Z) Zmodem")
- send(cr$+" Q) Quit")
- send(cr$+cr$+"Your choice:")
- CLR ch$
- menu("XKYZQ"+CHR$(13),ch$)
- SELECT ch$
- CASE "X"
- send("Xmodem")
- batch!=FALSE
- CASE "K"
- send("Xmodem 1K")
- batch!=FALSE
- CASE "Y"
- send("Ymodem")
- batch!=TRUE
- CASE "Z"
- send("Zmodem")
- batch!=TRUE
- DEFAULT
- send("Quit")
- proto!=FALSE
- ENDSELECT
- clr
- IF proto! AND NOT batch!
- send("Please enter filename: ")
- input(3,12,32,file$)
- IF EXIST(file_path$+file$)
- send(cr$+"We allready got "+file$)
- send(cr$+cr$+"Press ANY key")
- getchr(ch$)
- proto!=FALSE
- ENDIF
- ENDIF
- IF proto! AND NOT hangup!
- old_dir$=@cwd$
- ~@chd(file_path$)
- IF ch$="X"
- split(x_up$)
- ELSE IF ch$="K"
- split(k_up$)
- ELSE IF ch$="Y"
- split(y_up$)
- ELSE IF ch$="Z"
- split(z_up$)
- ENDIF
- IF batch!=FALSE
- part2$=part2$+" "+file$
- ENDIF
- clr
- send("Ready to recive, please start sending file(s)"+cr$)
- e%=@run(part1$,part2$)
- ~@chd(old_dir$)
- log("Uploaded "+file$+" Using "+ch$+", Returned "+STR$(e%)+".")
- clear_rs
- IF e%
- last_err$="Error "+STR$(e%)+" from Upload-protokoll ("+ch$+")."
- send(cr$+"Error "+STR$(e%)+" from "+part1$)
- send(cr$+cr$+"Press ANY key")
- getchr(ch$)
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE split(a$) !Divide line (first word - The rest)
- IF INSTR(a$," ")
- part1$=TRIM$(LEFT$(a$,INSTR(a$," ")))
- part2$=TRIM$(MID$(a$,INSTR(a$," ")))
- ELSE
- part1$=a$
- part2$=""
- ENDIF
- RETURN
- > PROCEDURE dir(path$) !Part 2 of Rawdir
- LOCAL t%,t$,d%,d$,size$,namn$
- '
- clr
- send("Name Size Date Time")
- send(cr$+"----------------------------------")
- ~FSETDTA(BASEPAGE+128)
- e%=FSFIRST(path$,-1)
- DO UNTIL e%
- a|=PEEK(BASEPAGE+128+21) !Attribut
- IF (NOT BTST(a|,1)) AND (NOT BTST(a|,2)) AND (NOT BTST(a|,3)) AND (NOT BTST(a|,4))
- t%=DPEEK(BASEPAGE+128+22) !time
- d%=DPEEK(BASEPAGE+128+24) !Date
- size$=STR$({BASEPAGE+128+26})!Size
- namn$=CHAR{BASEPAGE+158}
- '
- namn$=namn$+SPACE$(14-LEN(namn$))
- size$=size$+SPACE$(7-LEN(size$))
- '
- d$=" "+STR$(d% DIV 512+80)
- d$=d$+RIGHT$("0"+STR$(d%/32 AND 15),2)
- d$=d$+RIGHT$("0"+STR$(d% AND 31),2)
- '
- t$=" "+RIGHT$("0"+STR$(t% DIV 2048),2)+":"
- t$=t$+RIGHT$("0"+STR$(t% DIV 32 AND 63),2)
- ' t$=t$+RIGHT$("0"+STR$(t%+t% AND 63),2)
- send(cr$+namn$+size$+d$+t$)
- ENDIF
- e%=FSNEXT()
- LOOP
- RETURN
- '
- ' -----------------------------------------< MSG Functions
- '
- > PROCEDURE writemsg(area|,usr$,subject$) !Menu 27
- LOCAL found!,private!,nomsg!,to$,inp$,line%,line$,ch$,nomsg#
- allow_alias!=TRUE
- reply!=NOT (usr$="")
- IF NOT reply!
- open_header(area|)
- ENDIF
- clr
- IF allow_alias!
- from(from$)
- ELSE
- from$=user$
- ENDIF
- IF NOT reply!
- clr
- to(usr$)
- ENDIF
- clr
- private
- clr
- IF NOT reply!
- @subject(subject$)
- IF nomsg!
- GOTO write_out
- ENDIF
- ENDIF
- line%=1
- cont:
- clr
- IF private!
- send("Private message")
- ELSE
- send("Public Message")
- ENDIF
- send(cr$+"From : "+from$)
- send(cr$+"To : "+usr$)
- send(cr$+"Subject: "+subject$+cr$)
- IF line%<100
- DEC line%
- REPEAT
- INC line%
- line$=RIGHT$("00"+STR$(line%)+":",4)
- send(cr$+line$)
- inp$=rest$
- CLR rest$
- input(5,75,32,inp$)
- IF wordwrap!
- rest$=inp$
- IF RINSTR(rest$," ")
- rest$=MID$(rest$,RINSTR(rest$," ")+1)
- ELSE
- rest$=MID$(inp$,76)
- ENDIF
- send(STRING$(LEN(rest$),8)+STRING$(LEN(rest$),32))
- inp$=LEFT$(inp$,MAX(0,LEN(inp$)-LEN(rest$)-1))
- ENDIF
- msg$(line%)=inp$
- UNTIL inp$="" OR line%>99
- ENDIF
- IF line%>99
- send(cr$+"Continue in another message...")
- line%=100
- ENDIF
- menu:
- send(cr$+"(C)ontinue (D)elete (E)dit (I)nsert (L)ist (P)rivate (Q)uit")
- send(cr$+"sub(J)ect (T)o (S)ave")
- CLR ch$
- menu("CDEILPQJTS",ch$)
- send(ch$)
- IF ch$="C"
- GOTO cont
- ENDIF
- IF ch$="I"
- send(cr$+"Before which line ? (1-"+STR$(line%-1)+")")
- CLR inp$
- input(4,2,32,inp$)
- fra#=VAL(inp$)
- IF fra#<>0 AND fra#<line%
- send(cr$+"How many lines ?")
- CLR inp$
- input(4,2,32,inp$)
- inp#=VAL(inp$)
- IF inp#>0
- FOR f#=1 TO inp#
- FOR n#=line%+1 DOWNTO fra#
- IF n#<100
- SWAP msg$(n#+1),msg$(n#)
- ENDIF
- NEXT n#
- IF line%<100
- INC line%
- ENDIF
- msg$(100)=""
- NEXT f#
- ENDIF
- ENDIF
- ENDIF
- IF ch$="D"
- send(cr$+"What lines ? (1-"+STR$(line%-1)+")")
- CLR inp$
- input(1,75,32,inp$)
- IF INSTR(inp$,"-")
- inp#=VAL(inp$)
- IF inp#=0
- inp#=1
- ENDIF
- inp$=MID$(inp$,INSTR(inp$,"-")+1)
- inp2#=VAL(inp$)
- IF inp2#=0
- inp2#=1
- ENDIF
- IF inp#>inp2#
- SWAP inp#,inp2#
- ENDIF
- FOR n#=inp# TO inp2#
- FOR f#=inp# TO line%
- SWAP msg$(f#),msg$(f#+1)
- NEXT f#
- msg$(line%)=""
- DEC line%
- NEXT n#
- ELSE
- inp#=VAL(inp$)
- IF inp#<line% AND inp#>0
- FOR f#=inp# TO line%
- SWAP msg$(f#),msg$(f#+1)
- NEXT f#
- msg$(line%)=""
- DEC line%
- ENDIF
- ENDIF
- ENDIF
- IF ch$="E"
- send(cr$+"Which line ?")
- CLR inp$
- input(1,75,32,inp$)
- inp#=VAL(inp$)
- IF inp#=0
- inp#=1
- ENDIF
- inp$=msg$(inp#)
- line$=RIGHT$("000"+STR$(inp#)+":",4)
- send(cr$+line$)
- input(1,75,32,inp$)
- msg$(inp#)=inp$
- ENDIF
- IF ch$="L"
- send(cr$+"Which line ? (1-"+STR$(line%-1)+")")
- CLR inp$
- input(1,75,32,inp$)
- IF INSTR(inp$,"-")
- inp#=VAL(inp$)
- IF inp#=0
- inp#=1
- ENDIF
- inp$=MID$(inp$,INSTR(inp$,"-")+1)
- inp2#=VAL(inp$)
- IF inp#=0
- inp#=1
- ENDIF
- IF inp#>inp2#
- SWAP inp#,inp2#
- ENDIF
- FOR f#=inp# TO inp2#
- IF f#<line% AND f#>0
- line$=RIGHT$("000"+STR$(f#)+":",4)
- send(cr$+line$+msg$(f#))
- ENDIF
- NEXT f#
- ELSE
- inp#=VAL(inp$)
- IF inp#<line% AND inp#>0
- line$=RIGHT$("000"+STR$(inp#)+":",4)
- send(cr$+line$+msg$(inp#))
- ENDIF
- ENDIF
- ENDIF
- IF ch$="P"
- private
- ENDIF
- IF ch$="J"
- @subject(subject$)
- ENDIF
- IF ch$="T"
- to(usr$)
- ENDIF
- IF ch$="S"
- outdata$=""
- FOR f%=0 TO line%
- msg$=""
- FOR j%=1 TO LEN(msg$(f%))
- a$=MID$(msg$(f%),j%,1)
- SELECT a$
- CASE 10
- CASE 13
- msg$=msg$+CHR$(10)
- DEFAULT
- msg$=msg$+a$
- ENDSELECT
- NEXT j%
- outdata$=outdata$+msg$+CHR$(10)
- NEXT f%
- outdata$=outdata$+CHR$(10)+" -- SCS BBS "+version$+CHR$(0)
- @save_msg(my_zone&,my_net&,my_node&,my_point&,from$,usr$,subject$,outdata$)
- INC posted_msgs&
- s.msgs!=TRUE
- ~@init_userfile(99)
- put_user(99,rec%)
- CLOSE #99
- ENDIF
- IF ch$="Q"
- send(cr$+"Throw away message (y/N) ?")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$<>"Y"
- GOTO menu
- ENDIF
- ELSE
- IF ch$<>"S" AND ch$<>"Y"
- GOTO menu
- ENDIF
- ENDIF
- write_out:
- RETURN
- > PROCEDURE private !Ask Private if allowed
- IF usr$<>"All"
- send(cr$+"Private message (y/N) ?")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- send(ch$)
- CLR private!
- IF ch$="Y"
- private!=TRUE
- ENDIF
- ELSE
- private!=FALSE
- ENDIF
- RETURN
- > PROCEDURE searchmsg(area|) !Menu 23
- ' dec!=FALSE
- abort!=FALSE
- REPEAT
- hangup!=(NOT @cd IMP NOT local!)
- IF INP?(1) OR INP?(2)
- getchr(ch$)
- IF ch$="" OR ch$=CHR$(3)
- send(CHR$(13)+"-*- Aborted -*-"+cr$)
- getchr(ch$)
- abort!=TRUE
- ENDIF
- ENDIF
- EXIT IF hangup! OR abort!
- '
- IF dec!
- DEC f%
- IF f%<1
- f%=1
- send(cr$+"No more previous messages.")
- abort!=TRUE
- ENDIF
- ELSE
- INC f%
- IF f%>messages%
- f%=messages%
- abort!=TRUE
- ENDIF
- ENDIF
- '
- convert(f%)
- private!=BTST(attributes&,0)
- deleted!=BTST(attributes&,15)
- IF deleted! AND level|=>250
- deleted!=FALSE
- ENDIF
- IF private! AND level|=>250
- private!=FALSE
- ELSE IF from$=user$ OR from$=alias$
- private!=FALSE
- ELSE IF to$=user$ OR to$=alias$
- private!=FALSE
- ENDIF
- EXIT IF abort! OR hangup!
- UNTIL (NOT deleted!) AND (NOT private!)
- RETURN
- '
- > PROCEDURE readmsg(area|) !Menu 23
- open_header(area|)
- IF number_msgs%>0
- messages%=number_msgs%
- ENDIF
- '
- IF messages%=1
- send(cr$+"1 message, <Return>=lastread, start with:")
- ELSE
- send(cr$+STR$(messages%)+" messages, <Return>=lastread, start with:")
- ENDIF
- CLR inp$
- input(4,5,32,inp$)
- IF inp$=""
- f%=lastmsg&
- ELSE
- f%=VAL(inp$)
- ENDIF
- IF f%<1
- f%=1
- ELSE IF f%>messages%
- f%=messages%
- ENDIF
- DEC f%
- dec!=FALSE
- '
- DO
- send(cr$+"Looking for messages... (Press S to Stop, P to pause.)")
- searchmsg(area|)
- DO WHILE NOT abort! AND NOT hangup!
- again!=FALSE
- '
- ' Header
- '
- clr
- IF BTST(attributes&,0)
- send("Private message")
- ELSE
- send("Public message")
- ENDIF
- IF BTST(attributes&,8)
- send(", Local")
- ENDIF
- IF BTST(attributes&,15)
- send(", (Deleted).")
- ELSE
- send(".")
- ENDIF
- send(cr$+"Message #"+STR$(f%)+" of #"+STR$(messages%))
- send(cr$+"Date : "+datum$)
- send(cr$+"From : "+from$)
- send(cr$+"To : "+to$)
- send(cr$+"Subject: "+subj$+cr$+cr$)
- '
- ' Message
- '
- CLR ch$,col|,line&
- ud$=@read_msgs$(offset%,size&)
- FOR i%=1 TO LEN(ud$)
- a|=ASC(MID$(ud$,i%,1))
- '
- SELECT a|
- CASE 1
- ' ^A
- CASE 10
- send(cr$)
- INC line&
- col|=0
- CASE 13
- '
- DEFAULT
- OUT 2,a|
- IF NOT local!
- DO
- @modem_stat
- hangup!=(NOT dcd!) AND (NOT local!)
- LOOP UNTIL OUT?(1)
- EXIT IF hangup!
- OUT 1,a|
- ENDIF
- INC col|
- IF col|=>79
- col|=0
- send(" ")
- DO
- DEC i%
- a$=MID$(ud$,i%,1)
- IF a$=" " OR a$="." OR a$="-" OR a$="," OR a$="?" OR a$="!"
- send(cr$)
- INC line&
- EXIT IF TRUE
- ELSE
- send(" ")
- ENDIF
- LOOP
- ENDIF
- ENDSELECT
- '
- IF INP?(1) OR INP?(2) !Hotkeys
- getchr(ch$)
- ch$=UPPER$(ch$)
- IF ch$=CHR$(32) OR ch$="P"
- send(cr$+"-*- Paused -*-")
- getchr(ch$)
- send(CHR$(13)+" "+CHR$(13))
- ELSE IF ch$="S"
- CLR ch$
- EXIT IF TRUE
- ELSE IF ch$=CHR$(3)
- abort!=TRUE
- EXIT IF TRUE
- ELSE IF INSTR("ALNR"+CHR$(13),ch$)
- EXIT IF TRUE
- ENDIF
- ENDIF
- '
- NEXT i%
- '
- IF ch$="" OR ch$=CHR$(3)
- send(CHR$(13)+"-*- Aborted -*-"+cr$)
- abort!=TRUE
- FOR i%=1 TO 1000
- EXIT IF INP?(1) OR INP?(2)
- NEXT i%
- ENDIF
- IF f%>lastmsg&
- lastread!=TRUE
- lastmsg&=f%
- ENDIF
- IF ch$=""
- IF f%<=messages%
- send(CHR$(13)+"(A)gain (N)ext (L)ast (R)eply (Q)uit")
- IF delete$<>""
- send(" (D)elete")
- ENDIF
- ENDIF
- menu("ANLQR"+delete$+CHR$(13),ch$)
- ENDIF
- IF ch$="Q"
- send(cr$+"Quit")
- abort!=TRUE
- ELSE IF ch$="L"
- send(cr$+"Last")
- dec!=TRUE
- ELSE IF ch$="R"
- old_f%=f%
- writemsg(area|,from$,subj$)
- f%=old_f%
- ELSE IF ch$="A"
- send(cr$+"Again")
- again!=TRUE
- ELSE IF ch$="N" OR ch$=CHR$(13)
- send(cr$+"Next")
- dec!=FALSE
- ENDIF
- EXIT IF hangup!
- LOOP UNTIL NOT again! OR abort!
- LOOP UNTIL abort! OR hangup!
- IF NOT abort!
- send(cr$+"*** End of messages ***")
- FOR i%=1 TO 1000
- EXIT IF INP?(1) OR INP?(2)
- NEXT i%
- ENDIF
- IF lastread!
- ~@init_userfile(99)
- put_user(99,rec%)
- CLOSE #99
- ENDIF
- RETURN
- > PROCEDURE checkmsgs !Like Opus, Menu 22
- LOCAL messages%,mess!
- area|=1
- open_header(1)
- IF number_msgs%>0
- messages%=number_msgs%
- ELSE
- messages%=0
- ENDIF
- '
- f%=lastmsg&
- '
- send(cr$+"Looking for messages to you... (Press S to Stop)")
- FOR i%=f% TO messages%
- abort!=FALSE
- IF INP?(1) OR INP?(2)
- getchr(ch$)
- IF ch$="" OR ch$=CHR$(3)
- send(CHR$(13)+"-*- Aborted -*-"+cr$)
- getchr(ch$)
- abort!=TRUE
- ENDIF
- ENDIF
- EXIT IF hangup! OR abort!
- '
- '
- convert(i%)
- IF to$=user$ OR to$=alias$
- IF mess!
- send(STR$(i%)+" ")
- ELSE
- send(cr$+"Don't forget to read your mail: "+STR$(i%)+" ")
- mess!=TRUE
- ENDIF
- ENDIF
- EXIT IF abort! OR hangup!
- NEXT i%
- CLOSE #59
- IF mess!=TRUE
- send(cr$+cr$+"Press RETURN..."+CHR$(1))
- ENDIF
- RETURN
- > PROCEDURE quickscan(area|) !Menu 25
- open_header(area|)
- IF number_msgs%>0
- messages%=number_msgs%
- ENDIF
- '
- IF messages%=1
- send(cr$+"1 message, <Return>=lastread, start with:")
- ELSE
- send(cr$+STR$(messages%)+" messages, <Return>=lastread, start with:")
- ENDIF
- CLR inp$
- input(1,5,32,inp$)
- IF inp$=""
- f%=lastmsg&
- ELSE
- f%=VAL(inp$)
- ENDIF
- IF f%<1
- f%=1
- ELSE IF f%>messages%
- f%=messages%
- ENDIF
- DEC f%
- dec!=FALSE
- '
- clr
- send("Press Space or P to pause, S to Stop")
- send(cr$+" # From To Subject")
- send(cr$+STRING$(40,"-_")+cr$)
- DO WHILE (NOT abort!) AND (NOT hangup!)
- searchmsg(area|)
- send(STR$(f%)+SPACE$(4-LEN(STR$(f%))))
- IF LEN(from$)>20
- from$=LEFT$(from$,20)
- ENDIF
- send(from$+SPACE$(21-LEN(from$)))
- IF LEN(to$)>20
- to$=LEFT$(to$,20)
- ENDIF
- send(to$+SPACE$(21-LEN(to$)))
- IF LEN(subj$)>32
- subj$=LEFT$(subj$,32)
- ENDIF
- send(subj$+cr$)
- IF INP?(1) OR INP?(2)
- getchr(ch$)
- IF ch$=" " OR ch$="P"
- send(CHR$(13)+"*** Paused ***")
- getchr(ch$)
- send(CHR$(13))
- ENDIF
- ENDIF
- LOOP UNTIL f%=>messages%
- CLOSE #59
- send(cr$+"Press <RETURN>..."+CHR$(1))
- RETURN
- > PROCEDURE subject(VAR subject$) !Ask Subject
- nomsg!=FALSE
- send(cr$+"Subject: ")
- input(1,75,32,subject$)
- IF subject$=""
- nomsg!=TRUE
- ENDIF
- RETURN
- > PROCEDURE to(VAR usr$) !Ask to
- REPEAT
- send(cr$+"To :")
- CLR usr$
- input(2,74,32,usr$)
- IF usr$="All"
- found!=TRUE
- ELSE IF usr$="Sysop" OR LEN(usr$)=0
- usr$=sysop$
- found!=TRUE
- ELSE
- IF @newuser(usr$)>0
- found!=TRUE
- ENDIF
- CLOSE #99
- ENDIF
- IF found!=FALSE
- send(cr$+"This user does not exist, Another name? <Y/n>")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$="N"
- nomsg!=TRUE
- EXIT IF TRUE
- ENDIF
- ELSE
- send(cr$+"To "+usr$+", correct? <Y/n>")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$="N"
- found!=FALSE
- ENDIF
- ENDIF
- UNTIL found! OR hangup!
- RETURN
- > PROCEDURE from(VAR from$) !Ask for alias if allowed
- IF LEN(alias$)
- send(cr$+"Do you want to use your alias? (y/N)")
- CLR ch$
- menu("YN"+CHR$(13),ch$)
- IF ch$="Y"
- from$=alias$
- ELSE
- from$=user$
- ENDIF
- ELSE
- from$=user$
- ENDIF
- RETURN
- '
- > PROCEDURE open_header(nr|) !Init MSG-Area
- CLOSE #59
- proc$="Open_Header"
- area_name$=STRING$(4-LEN(STR$(nr|)),"0")+STR$(nr|)
- OPEN "R",#59,msg_path$+area_name$+".HDR",216
- FIELD #59,36 AS m_from$,36 AS m_to$,72 AS m_subject$,20 AS m_time$
- FIELD #59,4 AT(*m_stamp%),4 AT(*m_offset%),2 AT(*m_reserv1&),2 AT(*m_reply&)
- FIELD #59,2 AT(*m_attributes&)
- FIELD #59,2 AT(*mailer1&),2 AT(*mailer2&),2 AT(*mailer3&),2 AT(*mailer4&)
- FIELD #59,2 AT(*mailer5&),2 AT(*mailer6&),2 AT(*mailer7&),2 AT(*mailer8&)
- FIELD #59,2 AT(*m_size&),2 AT(*m_rc&)
- FIELD #59,2 AT(*m_cost&)
- FIELD #59,2 AT(*m_ozone&),2 AT(*m_onet&),2 AT(*m_onode&),2 AT(*m_opoint&)
- FIELD #59,2 AT(*m_dzone&),2 AT(*m_dnet&),2 AT(*m_dnode&),2 AT(*m_dpoint&)
- number_msgs%=LOF(#59)/216
- RETURN
- > PROCEDURE init_date !Init Date (On Start)
- proc$="Init_Date"
- '
- DIM mnds%(12) !Antal sekunder sedan b|rjan av ett r per mnad
- DIM mnd%(12) !Antal dagar sedan brjan av ret
- DIM mnd$(12) !Namn p mnader
- DIM day$(7) !Namn p dagarna
- DIM fn$(100)
- '
- max_fn#=0
- LOCAL t%,d%
- mnd%(0)=0
- FOR t%=1 TO 12
- READ mnd%(t%)
- mnd%(t%)=mnd%(t%)+mnd%(t%-1)
- mnds%(t%)=mnd%(t%)*86400
- NEXT t%
- FOR t%=1 TO 12
- READ mnd$(t%)
- NEXT t%
- FOR t%=0 TO 6
- READ day$(t%)
- NEXT t%
- DATA 0,31,28,31,30,31,30,31,31,30,31,30
- DATA "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"
- DATA "Sun","Mon","Tue","Wed","Thu","Fri","Sat"
- '
- RETURN
- > PROCEDURE convert(r_msgs%) !Read 1 header
- proc$="Convert()"
- GET #59,r_msgs%
- from$=CHAR{V:m_from$}
- to$=CHAR{V:m_to$}
- subj$=CHAR{V:m_subject$}
- datum$=CHAR{V:m_time$}
- stamp%=m_stamp%
- offset%=m_offset%
- attributes&=m_attributes&
- size&=m_size&
- ozone&=m_ozone&
- onet&=m_onet&
- onode&=m_onode&
- opoint&=m_opoint&
- dzone&=m_dzone&
- dnet&=m_dnet&
- dnode&=m_dnode&
- dpoint&=m_dpoint&
- RETURN
- > PROCEDURE delete(r_msgs%) !Delete a mail (Not used yet)
- proc$="Delete()"
- m_attributes&=m_attributes& OR -1
- FOR j%=1 TO 14
- m_attributes&=BCLR(m_attributes&,j%)
- NEXT j%
- PUT #59,r_msgs%
- RETURN
- > PROCEDURE save_msg(d_zone&,d_net&,d_node&,d_point&,from$,to$,subject$,outdata$)
- IF EXIST(msg_path$+area_name$+".MSG")
- OPEN "A",#60,msg_path$+area_name$+".MSG"
- ELSE
- OPEN "O",#60,msg_path$+area_name$+".MSG"
- ENDIF
- '
- INC number_msgs%
- '
- LSET m_from$=from$+CHR$(0)
- '
- LSET m_to$=to$+CHR$(0)
- '
- LSET m_subject$=subject$+CHR$(0)
- '
- LSET m_time$=@dates$+CHR$(0)
- '
- t_stamp%=@gmts !Not needed, Pack stamps it
- ' t_stamp%=0
- '
- m_offset%=LOF(#60)+1 !Lenght of netmails .MSG before saving outfile
- '
- m_reserv1&=0
- '
- m_reply&=0
- '
- m_attributes&=0
- IF private!
- m_attributes&=BSET(m_attributes&,0) !Private
- ENDIF
- ' m_attributes&=BSET(m_attributes&,7) !Kill/Sent
- m_attributes&=BSET(m_attributes&,8) !Local
- '
- '
- m_mailer1&=0 !8 reserved fields, Of Limits!
- m_mailer2&=0
- m_mailer3&=0
- m_mailer4&=0
- m_mailer5&=0
- m_mailer6&=0
- m_mailer7&=0
- m_mailer8&=0
- '
- m_size&=LEN(outdata$) !Lenght of outfile
- '
- m_rc&=0
- '
- m_cost&=0
- '
- m_ozone&=my_zone& !Origin
- m_onet&=my_net&
- m_onode&=my_node&
- m_opoint&=my_point&
- '
- m_dzone&=d_zone& !Destination
- m_dnet&=d_net&
- m_dnode&=d_node&
- m_dpoint&=d_point&
- '
- PUT #59,number_msgs%
- PRINT #60,outdata$
- CLOSE #60
- RETURN
- '
- ' -----------------------------------------< Door Functions
- '
- > PROCEDURE execute(file$)
- LOCAL ext$
- IF INSTR(file$," ")
- split(file$)
- file$=part1$
- cl$=part2$
- ENDIF
- IF INSTR(file$,".")
- ext$=RIGHT$(file$,RINSTR(file$,"."))
- IF ext$=".DOR"
- dor_parser(file$)
- ELSE
- e%=@run(file$,cl$)
- IF e%
- log("Error "+STR$(e%)+" from "+file$)
- ENDIF
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE dor_parser(file$) !Temporr lsning
- ' IF EXIST(dordir$+file$)
- game_1
- ' OPEN "I",#1,dordir$+file$
- '
- '
- '
- ' CLOSE #1
- ' ELSE
- ' send(cr$+"File doesn't exist!")
- ' log(file$+" doesn't exist!")
- ' ENDIF
- RETURN
- > PROCEDURE game_1
- CLR p.path$,p.name$,part1$,part2$
- @modem_stat
- IF dcd!
- a$=door_1$
- ELSE
- a$=door_1l$
- ENDIF
- split(a$)
- split_path(part1$)
- old_dir$=@cwd$
- ~@chd(p.path$)
- write_forem.dat
- e%=@run(p.name$,part2$)
- IF e%
- log("Error "+STR$(e%)+" from "+p.name$)
- ENDIF
- ~@chd(old_dir$)
- RETURN
- > PROCEDURE write_forem.dat !Write forem.dat
- LOCAL f%
- '
- fd$=STRING$(3882,0) ! Empty first
- MID$(fd$,3465)=LEFT$(UPPER$(pass$),13)+CHR$(0) ! Users password
- MID$(fd$,3478)=LEFT$(UPPER$(user$),31)+CHR$(0) ! His name
- MID$(fd$,3509)=RIGHT$(UPPER$(phone$),13)+CHR$(0) ! Phone number
- MID$(fd$,3522)=MKI$(25) ! Age
- MID$(fd$,3524)=CHR$(255) ! Line Feeds on/off
- MID$(fd$,3525)=MKI$(1) ! Computer Type
- '
- MID$(fd$,3629)=MKI$(30) ! Time Left today
- MID$(fd$,3631)=MKI$(2) ! Max Calls
- MID$(fd$,3633)=MKI$(1) ! Calls remaining
- MID$(fd$,3637)=MKI$(30) ! Time Left this call
- ' MID$(fd$,3629)=MKI$(FN timeleft) ! Time Left today
- ' MID$(fd$,3631)=MKI$(2) ! Max Calls
- ' MID$(fd$,3633)=MKI$(1) ! Calls remaining
- ' MID$(fd$,3637)=MKI$(FN timeleft) ! Time Left this call
- '
- MID$(fd$,3837)=LEFT$(UPPER$(city$),21)+CHR$(0) ! Users city
- '
- CLOSE #1
- OPEN "O",#1,"forem.dat"
- PRINT #1,fd$;
- CLOSE #1
- '
- RETURN
- '
- ' -----------------------------------------< Misc
- '
- > PROCEDURE read_bbs.cfg
- IF EXIST(scs$+"CONF\BBS.CFG")
- OPEN "I",#1,scs$+"CONF\BBS.CFG"
- REPEAT
- LINE INPUT #1,a$
- b$=TRIM$(a$)
- a$=UPPER$(TRIM$(a$))
- split(a$)
- IF LEFT$(part2$)="~"
- part2$=LEFT$(scs$,LEN(scs$)-1)+MID$(part2$,2)
- ENDIF
- IF part1$="SPEED"
- speed&=VAL(part2$)
- ELSE IF part1$="SPEEDLOCK"
- speedlock!=TRUE
- ELSE IF part1$="M_INIT"
- m.init1$=part2$
- ELSE IF part1$="M_INIT2"
- m.init2$=part2$
- ELSE IF part1$="M_BUSY"
- m.busy$=part$
- ELSE IF part1$="M_HANGUP"
- m.hangup$=part2$
- ELSE IF part1$="M_RESET"
- m.reset$=part2$
- '
- ELSE IF part1$="N_U_LEVEL"
- newuserlevel|=VAL(part2$)
- ELSE IF part1$="N_U_FLAG"
- newuserflag%=VAL(part2$)
- '
- ELSE IF part1$="SYSOP"
- split(b$)
- sysop$=part2$
- '
- ELSE IF part1$="SHELL"
- shell$=part2$
- ELSE IF part1$="DOORS"
- dordir$=part2$
- ELSE IF part1$="MEDITOR"
- editor$=part2$
- ELSE IF part1$="TEDITOR"
- text_editor$=part2$
- ELSE IF part1$="TEXT"
- text_path$=part2$
- ELSE IF part1$="MENU"
- menu_path$=part2$
- ELSE IF part1$="MSG"
- msg_path$=part2$
- ELSE IF part1$="FILES"
- file_path$=part2$
- ELSE IF part1$="X_DOWN"
- x_down$=part2$
- ELSE IF part1$="K_DOWN"
- k_down$=part2$
- ELSE IF part1$="Y_DOWN"
- y_down$=part2$
- ELSE IF part1$="Z_DOWN"
- z_down$=part2$
- ELSE IF part1$="X_UP"
- x_up$=part2$
- ELSE IF part1$="K_UP"
- k_up$=part2$
- ELSE IF part1$="Y_UP"
- y_up$=part2$
- ELSE IF part1$="Z_UP"
- z_up$=part2$
- ELSE IF part1$="ZONE"
- my_zone&=VAL(part2$)
- ELSE IF part1$="NET"
- my_net&=VAL(part2$)
- ELSE IF part1$="NODE"
- my_node&=VAL(part2$)
- ELSE IF part1$="POINT"
- my_point&=VAL(part2$)
- ELSE IF part1$="SCREENSAVER"
- screensaver|=VAL(part2$)
- ELSE IF part1$="TIMEOUT"
- timeout|=VAL(part2$)
- ELSE
- IF LEN(part1$)
- IF (LEFT$(part1$)<>";") AND (LEFT$(part1$)<>"#")
- PRINT "Unknown Config-Line <";b$;">"
- ENDIF
- ENDIF
- ENDIF
- UNTIL EOF(#1)
- ELSE
- PRINT "No CONF\BBS.CFG"
- EDIT
- ENDIF
- CLOSE #1
- RETURN
- > PROCEDURE setupvars !Init a lot of stuff at the start
- snoop!=TRUE
- keyclick(FALSE) ! No cursor-noise
- keyrepeat(TRUE)
- bell(TRUE) ! 'Pling!!!' on
- cr$=CHR$(13)+CHR$(10) ! <Cr> + <Lf>
- '
- lower$=SPACE$(256) ! Creates a string with no
- FOR f#=0 TO 255 ! capitals, but normal
- POKE V:lower$+f#,f# ! Much faster than Let
- NEXT f# ! or 'Lower$=lower$+....
- FOR f#=0 TO 255
- IF CHR$(f#)<>UPPER$(CHR$(f#))
- POKE V:lower$+ASC(UPPER$(CHR$(f#))),f# ! Much faster than mid$,
- ENDIF ! left$ & right$.
- NEXT f#
- '
- DIM msg$(100)
- '
- DIM free%(16)
- RETURN
- '
- > PROCEDURE bell(option|) !Bell on/off
- IF option|
- option|=4
- ENDIF
- SPOKE &H484,(PEEK(&H484) AND 251) OR option|
- RETURN
- > PROCEDURE chkend(ch#) !Check for CHR$(10) at EOF
- LOCAL loc# ! This routine checks if
- loc#=LOC(#ch#) ! the file can be read
- SEEK #ch#,MAX(0,LOF(#ch#)-1) ! with input. It can if
- IF EOF(#ch#)=FALSE ! the last byte is
- IF INP(#ch#)<>10 ! Chr$(10). Else it'll
- OUT #ch#,10 ! produce an error.
- ENDIF ! I don't know if this is
- ENDIF ! The best way solving
- SEEK #ch#,loc# ! this prob. but it works.
- RETURN
- > PROCEDURE cursor(option|) !Cursor on/off (VT52)
- ' Only for Atari
- IF option|
- send("e")
- ELSE
- send("f")
- ENDIF
- RETURN
- > PROCEDURE keyclick(option|) !Click on/off
- IF option|
- option|=1
- ENDIF
- SPOKE &H484,(PEEK(&H484) AND 254) OR option|
- RETURN
- > PROCEDURE keyrepeat(option|) !Key Repeat On/off
- IF option|
- option|=2
- ENDIF
- SPOKE &H484,(PEEK(&H484) AND 253) OR option|
- RETURN
- > PROCEDURE split_path(a$) !Split Path as Path$ and Name$
- IF INSTR(a$,"\")
- p.path$=TRIM$(LEFT$(a$,RINSTR(a$,"\")))
- p.name$=TRIM$(MID$(a$,RINSTR(a$,"\")+1))
- ELSE
- p.path$=""
- p.name$=a$
- ENDIF
- RETURN
- > PROCEDURE jump_to_dos
- PRINT " o Jumping to Dos..."
- old_dir$=@cwd$
- split_path(shell$)
- ~@chd(p.path$)
- e%=@run(p.name$,"")
- ~@chd(old_dir$)
- RETURN
- '
- > PROCEDURE play(a$,mus$) !Play Xbios 32 Music
- LOCAL do$,sluk$
- send(a$+cr$)
- IF EXIST(mus$)=FALSE AND EXIST(mus$+".MUS")
- mus$=mus$+".MUS"
- ENDIF
- IF EXIST(mus$)
- CLOSE #15
- OPEN "I",#15,mus$
- do$=INPUT$(MIN(LOF(#15),32766),#15)+CHR$(0)
- CLOSE #15
- sluk$=MKI$(0)
- VOID XBIOS(32,L:VARPTR(sluk$))
- SOUND 0,0
- SOUND 1,0
- SOUND 2,0
- VOID XBIOS(32,L:VARPTR(sluk$))
- SOUND 0,0
- SOUND 1,0
- SOUND 2,0
- VOID XBIOS(32,L:VARPTR(do$))
- ENDIF
- RETURN
- '
- > PROCEDURE wait(sec%) !Wait for sec%*50 secounds
- sec%=TIMER+sec%
- REPEAT
- UNTIL TIMER>sec%
- RETURN
- > PROCEDURE wrap(VAR wrap$) !Wrap text longer then 80 chr
- LOCAL rest$,found#
- REPEAT
- IF LEN(wrap$)>80
- IF RINSTR(LEFT$(wrap$,80)," ")
- rest$=rest$+LEFT$(wrap$,RINSTR(LEFT$(wrap$,80)," ")-1)+cr$
- wrap$=MID$(wrap$,RINSTR(LEFT$(wrap$,80)," ")+1)
- ELSE
- rest$=rest$+LEFT$(wrap$,80)
- wrap$=MID$(wrap$,81)
- ENDIF
- ELSE
- rest$=rest$+wrap$
- CLR wrap$
- ENDIF
- REPEAT
- IF LEFT$(wrap$)=" "
- wrap$=MID$(wrap$,2)
- ENDIF
- UNTIL LEFT$(wrap$)<>" "
- UNTIL wrap$=""
- wrap$=rest$
- RETURN
- '
- > PROCEDURE log(a$) !Logging
- IF EXIST("BBS.LOG")
- OPEN "A",#50,"BBS.LOG"
- ELSE
- OPEN "O",#50,"BBS.LOG"
- PRINT #50," - SCS BBS Logfile, Created ";DATE$;" at ";TIME$
- PRINT #50
- ENDIF
- PRINT #50,LEFT$(DATE$,5);" ";LEFT$(TIME$,5);" : BBS ";a$
- CLOSE #50
- RETURN
- > PROCEDURE statusline !Lastuser Lines
- lastuser$=user$
- IF LEN(user$)>22
- lastuser$=LEFT$(lastuser$)+" "+MID$(lastuser$,INSTR(lastuser$," "))
- IF LEN(lastuser$)>22
- lastuser$=LEFT$(lastuser$,22)
- ENDIF
- ELSE IF LEN(lastuser$)<22
- lastuser$=lastuser$+SPACE$(22-LEN(lastuser$))
- ENDIF
- last_time$=LEFT$(last_time$,2)+":"+RIGHT$(last_time$,2)
- statusline$=" "+lastuser$+last_time$+" "+LEFT$(TIME$,5)+" "
- '
- sec$=STR$(level|)
- IF LEN(sec$)<3
- sec$=sec$+SPACE$(3-LEN(sec$))
- ENDIF
- statusline$=statusline$+sec$+" "
- '
- cred$=STR$(credits&)
- IF LEN(cred$)<5
- cred$=cred$+SPACE$(5-LEN(credit$))
- ENDIF
- statusline$=statusline$+cred$+" "
- '
- pmsg$=STR$(posted_msgs&)
- IF LEN(pmsg$)<4
- pmsg$=pmsg$+SPACE$(4-LEN(pmsg$))
- ENDIF
- statusline$=statusline$+pmsg$+" "
- '
- call$=STR$(calls&)
- IF LEN(call$)<5
- call$=call$+SPACE$(5-LEN(call$))
- ELSE IF LEN(call$)>5
- call$=LEFT$(call$,4)+"-"
- ENDIF
- statusline$=statusline$+call$+" "
- '
- ud$=STR$(down_today&)+"/"+STR$(down_kb&)+"/"+STR$(upl_kb&)
- IF LEN(ud$)<13
- ud$=ud$+SPACE$(13-LEN(ud$))
- ELSE IF LEN(ud$)>13
- ud$=LEFT$(ud$,12)+"-"
- ENDIF
- statusline$=statusline$+ud$+" "
- '
- statusline$=statusline$+"("
- IF error!
- statusline$=statusline$+"!"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- IF s.yell!
- statusline$=statusline$+"Y"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- IF s.msgs!
- statusline$=statusline$+"M"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- IF net!
- statusline$=statusline$+"N"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- IF echo!
- statusline$=statusline$+"E"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- IF s.dc!
- statusline$=statusline$+"D"
- ELSE
- statusline$=statusline$+"-"
- ENDIF
- statusline$=statusline$+")"
- '
- INSERT statusline$(0)=statusline$
- OPEN "O",#1,"CONF\STATLINE.BBS"
- STORE #1,statusline$()
- CLOSE #1
- '
- CLR statusline$
- RETURN
- '
- ' -----------------------------------------< Modem Routins
- '
- > PROCEDURE clr !Send CLS
- IF BTST(attribut|,0)
- send2("E "+CHR$(13)) ! Clear both IBM and Atari
- ELSE
- send2(cr$+cr$+cr$)
- ENDIF
- RETURN
- > PROCEDURE cat(file$,pause$,break$) !Send file to modem and screen
- LOCAL cat$,break!,f%
- break$=UPPER$(break$)
- IF EXIST(file$)
- ELSE IF EXIST(file$+".ASC")
- file$=file$+".ASC"
- ELSE IF EXIST(text_path$+file$)
- file$=text_path$+file$
- ELSE IF EXIST(text_path$+file$+".ASC")
- file$=text_path$+file$+".ASC"
- ENDIF
- IF EXIST(file$)
- CLOSE #2
- OPEN "I",#2,file$
- cat$=INPUT$(LOF(#2),#2)
- CLOSE #2
- FOR f%=1 TO LEN(cat$)
- a|=ASC(MID$(cat$,f%,1))
- IF INP?(1) OR INP?(2)
- getchr(ch$)
- IF INSTR(pause$,UPPER$(ch$))
- getchr(ch$)
- ELSE IF INSTR(break$,UPPER$(ch$))
- break!=TRUE
- ENDIF
- ENDIF
- EXIT IF hangup!
- EXIT IF break!
- send(CHR$(a|))
- NEXT f%
- ELSE
- PRINT
- PRINT "o ";file$;" doesn't exist"
- ENDIF
- RETURN
- > PROCEDURE getchr(VAR ch$) !Get 1 chr from modem or consol (DCD)
- LOCAL timeout!,timeout%,timewarn!,t.timeout|
- key_pressed!=FALSE
- REPEAT
- timeout%=TIMER
- t.timeout|=timeout|
- REPEAT
- @modem_stat
- hangup!=(NOT dcd!) AND (NOT local!)
- IF TIMER-timeout%>(12000*t.timeout|)
- IF timewarn!=FALSE
- send(cr$+cr$+"Warning! You will be logged of in 1 minute if you dont show any sign of life!"+cr$+cr$)
- t.timeout|=1
- timeout%=TIMER
- timewarn!=TRUE
- ELSE
- timeout!=TRUE
- ENDIF
- ENDIF
- UNTIL (INP?(1) OR INP?(2)) OR hangup! OR timeout!
- IF hangup!
- PRINT
- PRINT " o Dropped Carrier!"
- ELSE IF timeout!
- send(cr$+"Timeout! Bye.")
- log(user$+" Logged off due to inactivity.")
- hangup!=TRUE
- ENDIF
- EXIT IF hangup!
- IF INP?(1)
- ch$=CHR$(INP(1))
- key_pressed!=TRUE
- ELSE IF INP?(2)
- i#=INP(2)
- SELECT i#
- CASE 163 !Alt H
- hangup!=TRUE
- CASE 165 !Alt-J
- send(cr$+"Sysop ha jumped to dos, please wait...")
- jump_to_dos
- send(cr$+"Back from dos, Hi again!")
- CASE 196 ! F10
- chat
- CASE 225 !Undo
- EDIT
- CASE 226 !Help
- PRINT
- PRINT " o ";user$;" (";alias$;") from ";city$;" in ";baud$;" baud"
- DEFAULT
- key_pressed!=TRUE
- ch$=CHR$(i#)
- ENDSELECT
- ENDIF
- UNTIL key_pressed!
- RETURN
- > PROCEDURE input(type|,max%,del%,VAR input$) !Get line of text
- '
- '
- ' Type 0 Password (Hide output)
- ' Type 1 Normal input
- ' Type 2 Name
- ' Type 3 All upper
- ' Type 4 Numbers
- ' Type 5 Wordwrap
- '
- ' Max% Lenght of string
- '
- ' Del% Char to overwite with
- '
- ' Input$ Answer String
- '
- LOCAL ch$,xcrs%
- CLR wordwrap!
- IF type|=0
- CLR input$
- ELSE
- send(input$)
- xcrs%=LEN(input$)
- ENDIF
- REPEAT
- getchr(ch$)
- EXIT IF hangup!
- IF ASC(ch$)<>13 !Om ej return
- ' vvvv -- Radera --- vvv
- IF ch$=CHR$(8) !Om backspace radera...
- IF xcrs%>0
- SELECT type|
- CASE 0 !Password
- send(CHR$(8)+STRING$(LEN(MID$(input$,xcrs%+1)),".")+CHR$(del%)+STRING$(LEN(MID$(input$,xcrs%)),8))
- input$=LEFT$(input$,MAX(0,xcrs%-1))+MID$(input$,xcrs%+1)
- DEC xcrs%
- CASE 2 !Namn osv
- input$=LEFT$(input$,MAX(0,xcrs%-1))+MID$(input$,xcrs%+1)
- IF input$>"" AND input$<>" "
- POKE V:input$,ASC(UPPER$(input$))
- FOR f%=V:input$+1 TO V:input$+LEN(input$)-1
- IF PEEK(f%-1)=32 OR PEEK(f%-1)=45 OR PEEK(f%-1)=46 OR PEEK(f%-1)=95
- POKE f%,ASC(UPPER$(CHR$(PEEK(f%))))
- ELSE
- POKE f%,ASC(MID$(lower$,PEEK(f%)+1))
- ENDIF
- NEXT f%
- ENDIF
- send(CHR$(8)+MID$(input$,xcrs%)+CHR$(del%)+STRING$(LEN(MID$(input$,xcrs%))+1,8))
- DEC xcrs%
- DEFAULT
- send(CHR$(8)+MID$(input$,xcrs%+1)+CHR$(del%)+STRING$(LEN(MID$(input$,xcrs%)),8))
- input$=LEFT$(input$,MAX(0,xcrs%-1))+MID$(input$,xcrs%+1)
- DEC xcrs%
- ENDSELECT
- ENDIF
- ' vvvv --- Special Chars ---- vvvv
- ELSE IF ch$=CHR$(27) ! --- Om Escape radera string
- send(STRING$(LEN(input$),8)+STRING$(LEN(input$),32)+STRING$(LEN(input$),8))
- CLR input$
- CLR xcrs%
- ELSE IF ch$=CHR$(200) ! --- Om Pil upp
- ELSE IF ch$=CHR$(203) ! --- Om pil left (<-)
- IF xcrs%>0
- DEC xcrs%
- send(CHR$(8))
- ENDIF
- ELSE IF ch$=CHR$(205) ! --- Om pil right (->) (Atari Only)
- IF xcrs%<LEN(input$)
- INC xcrs%
- send(CHR$(27)+"C")
- ENDIF
- ELSE IF ch$=CHR$(208) ! --- Om pil ner
- ' ------------------------------------
- ELSE !Add string
- SELECT type|
- CASE 0
- IF ch$>CHR$(31)
- IF xcrs%<max%
- INC xcrs%
- send("."+STRING$(LEN(MID$(input$,xcrs%)),".")+STRING$(LEN(MID$(input$,xcrs%)),8))
- input$=UPPER$(LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%))
- ELSE
- input$=UPPER$(LEFT$(LEFT$(input$,MAX(0,xcrs%-1)),max%-1)+ch$)
- ENDIF
- ENDIF
- CASE 1
- IF ch$>CHR$(31)
- IF xcrs%<max% ! --- While not max lenght
- INC xcrs%
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%)
- send(MID$(input$,xcrs%)+STRING$(LEN(MID$(input$,xcrs%+1)),8))
- ELSE ! --- Else dont make string longer
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1)),max%-1)+ch$
- send(CHR$(8)+ch$)
- ENDIF
- ENDIF
- CASE 2
- IF ch$>CHR$(31)
- IF xcrs%<max%
- INC xcrs%
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%)
- IF input$>"" AND input$<>" "
- POKE V:input$,ASC(UPPER$(input$))
- FOR f%=V:input$+1 TO V:input$+LEN(input$)-1
- IF PEEK(f%-1)=32 OR PEEK(f%-1)=45 OR PEEK(f%-1)=46 OR PEEK(f%-1)=95
- POKE f%,ASC(UPPER$(CHR$(PEEK(f%))))
- ELSE
- POKE f%,ASC(MID$(lower$,PEEK(f%)+1))
- ENDIF
- NEXT f%
- ENDIF
- send(MID$(input$,xcrs%)+STRING$(LEN(MID$(input$,xcrs%+1)),8))
- ELSE
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1)),max%-1)+ch$
- IF input$>"" AND input$<>" "
- POKE V:input$,ASC(UPPER$(input$))
- FOR f%=V:input$+1 TO V:input$+LEN(input$)-1
- IF PEEK(f%-1)=32 OR PEEK(f%-1)=45 OR PEEK(f%-1)=46 OR PEEK(f%-1)=95
- POKE f%,ASC(UPPER$(CHR$(PEEK(f%))))
- ELSE
- POKE f%,ASC(MID$(lower$,PEEK(f%)+1))
- ENDIF
- NEXT f%
- ENDIF
- send(CHR$(8)+RIGHT$(input$))
- ENDIF
- ENDIF
- CASE 3
- IF ch$>CHR$(31)
- IF xcrs%<max%
- INC xcrs%
- input$=LEFT$(UPPER$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%)),max%)
- send(MID$(input$,xcrs%)+STRING$(LEN(MID$(input$,xcrs%+1)),8))
- ELSE
- input$=LEFT$(UPPER$(LEFT$(input$,MAX(0,xcrs%-1))),MAX(0,max%-1))+ch$
- send(CHR$(8)+UPPER$(ch$))
- ENDIF
- ENDIF
- CASE 4
- IF ch$>"/" AND ch$<":" OR ch$=" "
- IF xcrs%<max%
- INC xcrs%
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%)
- send(MID$(input$,xcrs%)+STRING$(LEN(MID$(input$,xcrs%+1)),8))
- ELSE
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1)),MAX(0,max%-1))+ch$
- send(CHR$(8)+ch$)
- ENDIF
- ENDIF
- CASE 5 !wordwrap!
- IF ch$>CHR$(31)
- IF xcrs%<max%
- INC xcrs%
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%+1)
- send(MID$(input$,xcrs%)+STRING$(LEN(MID$(input$,xcrs%+1)),8))
- ELSE
- INC xcrs%
- input$=LEFT$(LEFT$(input$,MAX(0,xcrs%-1))+ch$+MID$(input$,xcrs%),max%+1)
- wordwrap!=TRUE
- ENDIF
- ENDIF
- ENDSELECT
- ENDIF
- ENDIF
- UNTIL ASC(ch$)=13 OR wordwrap! OR (type|=5 AND ch$=CHR$(3))
- RETURN
- > PROCEDURE menu(option$,VAR ch$) !Use for hotkeys
- option$=UPPER$(option$) ! Wait until one of chars
- DO ! in option$ pressed.
- ch$=UPPER$(ch$)
- EXIT IF INSTR(option$,ch$) OR option$="" OR hangup!
- getchr(ch$)
- LOOP
- RETURN
- '
- > PROCEDURE send(send$) !Send line to modem/screen
- LOCAL send%,i|
- IF LEN(send$)
- FOR send%=1 TO LEN(send$)
- i|=ASC(MID$(send$,send%,1))
- SELECT i|
- CASE 1
- REPEAT
- getchr(ch$)
- UNTIL ch$=CHR$(13)
- CASE 10
- IF more!
- INC more%
- IF more%=screenlenght|-1
- getchr(ch$)
- ENDIF
- ENDIF
- send2(CHR$(10))
- CASE 12
- clr
- CASE "^"
- reverse
- DEFAULT
- IF NOT local!
- REPEAT
- @modem_stat
- UNTIL OUT?(1) OR (NOT dcd!)
- OUT 1,i|
- ENDIF
- OUT 2,i|
- ENDSELECT
- NEXT send%
- ENDIF
- RETURN
- > PROCEDURE send2(s$) !Send line to modem/screen
- IF LEN(s$)
- FOR s%=1 TO LEN(s$)
- s|=ASC(MID$(s$,s%,1))
- IF NOT local!
- REPEAT
- @modem_stat
- UNTIL OUT?(1) OR (NOT dcd!)
- OUT 1,s|
- ENDIF
- OUT 2,s|
- NEXT s%
- ENDIF
- RETURN
- > PROCEDURE reverse
- IF reverse!
- reverse!=FALSE
- SELECT graphics|
- CASE 0 !Ascii
- CASE 1 !VT52 mono
- send2(CHR$(27)+"q")
- CASE 2 !VT52 Color
- send2(CHR$(27)+"q")
- CASE 3 !Vt52
- CASE 4 !Ansi
- send(CHR$(27)+"[m")
- ENDSELECT
- ELSE
- reverse!=TRUE
- SELECT graphics|
- CASE 0 !Ascii
- CASE 1 !VT52 mono
- send2(CHR$(27)+"p")
- CASE 2 !VT52 Color
- send2(CHR$(27)+"p")
- CASE 3 !Vt52
- CASE 4 !Ansi
- send(CHR$(27)+"[7m")
- ENDSELECT
- ENDIF
- RETURN
- > PROCEDURE type(type$) !Simulated Sysop
- LOCAL f#,n# ! Just some fun...
- DIM key#(255)
- FOR f#=0 TO 255
- key#(f#)=INT(RND*45)+10
- NEXT f#
- FOR n#=1 TO LEN(type$)
- t#=TIMER+key#(ASC(MID$(type$,n#,1)))
- REPEAT
- UNTIL TIMER>t#
- send(MID$(type$,n#,1))
- IF MID$(type$,f#,1)=" "
- t#=TIMER+INT(RND*10)+55
- REPEAT
- UNTIL TIMER>t#
- ENDIF
- NEXT n#
- ERASE key#()
- RETURN
- '
- > PROCEDURE chat !Very simple chat
- clr
- send("wpMinichat. press Ctrl-c to exit. qv"+cr$)
- send("Hmm, vad vill "+user$+" nu d}? :-)"+cr$+cr$)
- REPEAT
- IF INP?(1)
- i%=INP(1)
- send(CHR$(i%))
- IF i%=13
- send(CHR$(10))
- ENDIF
- ENDIF
- IF INP?(2)
- i%=INP(2)
- IF i%=165
- send(cr$+"Sysop ha jumped to dos, please wait...")
- jump_to_dos
- send(cr$+"Back from dos, Hi again!")
- ELSE
- send(CHR$(i%))
- ENDIF
- IF i%=13
- send(CHR$(10))
- ENDIF
- ENDIF
- UNTIL i%=3
- send(cr$+cr$+"Bye!")
- send(cr$+cr$+"-- Chat ended, Press return")
- RETURN
- '
- > PROCEDURE get_baud(VAR baud|) !Get&Set baud (part 1)
- baud$=""
- baud|=255
- get_baud1
- IF LEN(baud$)=0
- IF speedlock!
- baud|=255
- baud$="???"
- ELSE
- get_baud2 ! Couldn't catch 'CONNECT'
- ENDIF
- ENDIF
- IF NOT speedlock!
- IF baud|<255
- setbaud(baud|)
- ENDIF
- ENDIF
- RETURN
- > PROCEDURE get_baud1 !Get baud (part 2) (Normal)
- LOCAL t%,connect$ ! Like normal BBS
- t%=TIMER+1000 !10 Sek
- REPEAT
- IF INP?(1)
- connect$=connect$+CHR$(INP(1))
- IF INSTR(connect$,"CONNECT"+CHR$(13)) ! 300 Baud
- baud|=9
- baud$="300"
- ELSE IF INSTR(connect$,"CONNECT 1200") ! 1200 Baud
- baud|=7
- baud$="1200"
- ELSE IF INSTR(connect$,"CONNECT 2400") ! 2400 Baud
- baud|=4
- baud$="2400"
- ELSE IF INSTR(connect$,"CONNECT 9600")
- baud|=0
- baud$="9600"
- ELSE IF LEN(connect$)>15
- connect$=MID$(connect$,2)
- ENDIF
- ENDIF
- UNTIL TIMER>t% OR baud|<255
- RETURN
- > PROCEDURE get_baud2 !Get baud (Part 3) (Michtron Style)
- LOCAL i%,f%,t% ! Like Michtron BBS
- REPEAT
- FOR f%=0 TO 9
- SELECT f%
- CASE 0,1,2,4,7,9 ! 19200 9600 4800 2400 1200 300
- setbaud(f%)
- clr
- send(cr$+"Press <Return>"+cr$)
- t%=TIMER+600
- REPEAT
- IF INP?(1)
- i%=INP(1)
- IF i%=13
- baud|=f%
- ENDIF
- ENDIF
- UNTIL TIMER>t% OR baud|=>0 OR FN cd=FALSE
- ENDSELECT
- EXIT IF FN cd=FALSE OR baud|<255
- NEXT f%
- UNTIL FN cd=FALSE OR baud|<255
- RETURN
- > PROCEDURE setbaud(baud|) !Set Baud
- VOID XBIOS(15,W:baud|,W:-1,W:-1,W:-1,W:-1,W:-1)
- ' Baudrates:
- ' Input: gives:
- ' 0 = 19200
- ' 1 = 9600
- ' 2 = 4800
- ' 3 = 3600
- ' 4 = 2400
- ' 5 = 2000
- ' 6 = 1800
- ' 7 = 1200
- ' 8 = 600
- ' 9 = 300
- ' 10 = 200
- ' 11 = 150
- ' 12 = 134
- ' 13 = 110
- ' 14 = 75
- ' 15 = 50
- RETURN
- > PROCEDURE setup_modem !Trash
- setbaud(0) ! most modems can read
- ' send("ATZ"+CHR$(13)) ! at 300 baud.
- ' wait(2)
- ' send("AT S0=1 "+CHR$(13)) ! I found out, that if
- ' wait(2) ! you put 3 times plus
- REPEAT ! before a modemcommand,
- IF INP?(1) ! then you can be more
- ~INP(1) ! sure, that it's read.
- ENDIF
- UNTIL INP?(1)=FALSE
- RETURN
- '
- > PROCEDURE modem(mcommand$) !Send modem Commands (Part 1)
- proc$="modem()"
- @modem_stat
- IF dcd!
- ' PRINT " o Carrier present"
- ENDIF
- clear_rs
- IF @mod(mcommand$)
- '
- ELSE
- PRINT " o Error in Modem Commands"
- ENDIF
- RETURN
- > PROCEDURE modem_stat !Check status of Modem
- proc$="Modem_stat"
- LOCAL r%
- r%=PEEK(&HFFFA01)
- centronics_busy!=NOT BTST(r%,0)
- dcd!=NOT BTST(r%,1)
- cts!=NOT BTST(r%,2)
- blitter_klar!=NOT BTST(r%,3)
- ri!=NOT BTST(r%,6)
- monokrom!=NOT BTST(r%,7)
- RETURN
- > PROCEDURE clear_rs !Clear RS232 and keybord Buffers
- proc$="Clear RS"
- ii%=3000
- REPEAT
- IF INP?(2)
- ~INP(2)
- ELSE IF INP?(1)
- ~INP(1)
- ENDIF
- PAUSE ABS(INT(ii%/1000))
- DEC ii%
- UNTIL (NOT INP?(1)) AND (NOT INP?(2))
- RETURN
- '
- ' -----------------------------------------< FUNCTIONS
- '
- > FUNCTION mod(a$) !Send Modem Commands (Part 2)
- LOCAL timeout%
- e!=FALSE
- proc$="FN mod()"
- FOR i%=1 TO LEN(a$)
- a%=ASC(MID$(a$,i%,1))
- SELECT CHR$(a%)
- CASE "|"
- OUT 1,13
- CASE "^"
- ~XBIOS(29,NOT 16)
- CASE "v"
- ~XBIOS(30,16)
- CASE "("
- ~XBIOS(29,NOT 8)
- timeout%=TIMER
- REPEAT
- @modem_stat
- UNTIL cts! OR ((TIMER-timeout%)>1000)
- IF NOT cts!
- e!=TRUE
- ENDIF
- CASE ")"
- ~XBIOS(30,8)
- CASE "~"
- PAUSE 50
- clear_rs
- CASE "'"
- PAUSE 10
- DEFAULT
- OUT 1,a%
- ENDSELECT
- NEXT i%
- IF e!
- RETURN FALSE
- ELSE
- RETURN TRUE
- ENDIF
- ENDFUNC
- '
- > FUNCTION enviroment$(string$) !Search for a Enviroment
- proc$="FN Enviroment$()"
- l%=LEN(string$)
- gotit!=FALSE
- env%={BASEPAGE+&H2C}
- DO
- env$=CHAR{env%}
- IF LEFT$(env$,l%)=string$
- env$=MID$(env$,l%+1)
- gotit!=TRUE
- ENDIF
- EXIT IF LEN(env$)=0 OR gotit!
- ADD env%,SUCC(LEN(env$))
- LOOP
- IF NOT gotit!
- env$=CHR$(GEMDOS(25)+65)+":"+DIR$(0)+"\"
- ELSE IF RIGHT$(env$)<>"\"
- env$=env$+"\"
- ENDIF
- RETURN env$
- ENDFUNC
- '
- > FUNCTION newuser(usr$) !Search for a User
- l%=@init_userfile(99)
- IF l%
- FOR f%=1 TO l%
- GET #99
- IF UPPER$(usr$)=UPPER$(CHAR{V:u.user$})
- RETURN f%
- ELSE IF UPPER$(usr$)=UPPER$(CHAR{V:u.alias$})
- RETURN f%
- ENDIF
- NEXT f%
- ENDIF
- RETURN FALSE
- ENDFUNC
- > FUNCTION init_userfile(channel%) !Init Userfile
- CLOSE #channel%
- OPEN "R",#channel%,scs$+"CONF\BBS.USR",150
- FIELD #channel%,36 AS u.user$,16 AS u.city$,16 AS u.alias$,16 AS u.pass$
- FIELD #channel%,16 AS u.phone$,4 AS u.last_time$,6 AS u.last_date$
- FIELD #channel%,1 AT(*u.attribut|),1 AT(*u.screenlenght|),4 AT(*u.flags%)
- FIELD #channel%,2 AT(*u.credit&),2 AT(*u.posted_msgs&),1 AT(*u.graphics|)
- FIELD #channel%,1 AT(*u.level|),2 AT(*u.calls&),2 AT(*u.uploads&)
- FIELD #channel%,2 AT(*u.downloads&),2 AT(*u.upl_kb&),2 AT(*u.down_kb&)
- FIELD #channel%,2 AT(*u.down_today&),2 AT(*u.minutes_today&)
- FIELD #channel%,2 AT(*u.lastfile%),2 AT(*u.lastmsg&),1 AT(*u.charset|)
- FIELD #channel%,9 AS reserv$
- RETURN LOF(#channel%)/150
- ENDFUNC
- > FUNCTION init_t.userfile(channel%) !Dito (For useredit)
- CLOSE #channel%
- OPEN "R",#channel%,scs$+"CONF\BBS.USR",150
- FIELD #channel%,36 AS tu.user$,16 AS tu.city$,16 AS tu.alias$,16 AS tu.pass$
- FIELD #channel%,16 AS tu.phone$,4 AS tu.last_time$,6 AS tu.last_date$
- FIELD #channel%,1 AT(*tu.attribut|),1 AT(*tu.screenlenght|),4 AT(*tu.flags%)
- FIELD #channel%,2 AT(*tu.credit&),2 AT(*tu.posted_msgs&),1 AT(*tu.graphics|)
- FIELD #channel%,1 AT(*tu.level|),2 AT(*tu.calls&),2 AT(*tu.uploads&)
- FIELD #channel%,2 AT(*tu.downloads&),2 AT(*tu.upl_kb&),2 AT(*tu.down_kb&)
- FIELD #channel%,2 AT(*tu.down_today&),2 AT(*tu.minutes_today&)
- FIELD #channel%,2 AT(*tu.lastfile%),2 AT(*tu.lastmsg&),1 AT(*tu.charset|)
- FIELD #channel%,9 AS reserv$
- RETURN LOF(#channel%)/150
- ENDFUNC
- '
- > FUNCTION init_files.dat(path$) !Init files.dat
- CLOSE #16
- OPEN "R",#16,path$+"FILES.DAT",54
- FIELD #16,36 AS f.fuploader$,13 AS f.ffilename$,2 AT(*f.fcounter&)
- FIELD #16,2 AT(*f.fnumber&),1 AT(*f.fdelete|)
- RETURN LOF(#16)/54
- ENDFUNC
- '
- > FUNCTION run(prg$,cmd$) !Execute a program
- proc$="FN Run()"
- '
- ' env$="SHELL="+shell$+CHR$(0) ! Create QBBS variable
- ' env$=env$+"TMP=A:\"
- ' env$=env$+"MAILER=B:\MAILER\"+MKI$(0) ! Create TB variable
- '
- env$=@get_env$
- cmd$=CHR$(LEN(cmd$))+cmd$+CHR$(0)
- '
- RESERVE 16384 ! Shrink heap
- ' e%=GEMDOS(75,W:0,L:V:prg$,L:V:cmd$,L:V:env$) ! Run program
- e%=EXEC(0,prg$,cmd$,env$)
- RESERVE ! Restore heap
- '
- RETURN e%
- ENDFUNC
- > FUNCTION get_env$
- proc$="FN Enviroment$()"
- LOCAL e$,env%
- env$=""
- env%={BASEPAGE+&H2C}
- DO
- e$=CHAR{env%}
- env$=env$+e$+CHR$(0)
- EXIT IF LEN(e$)=0
- ADD env%,SUCC(LEN(e$))
- LOOP
- RETURN env$+CHR$(0)
- ENDFUNC
- '
- > FUNCTION cwd$ !Return Current Work Dir
- a$=CHR$(GEMDOS(&H19)+65)+":"
- a$=a$+DIR$(0)+"\"
- RETURN a$
- ENDFUNC
- > FUNCTION chd(a$) !Change Dir
- IF MID$(a$,2,1)=":"
- CHDRIVE LEFT$(a$)
- a$=MID$(a$,3)
- ENDIF
- IF RIGHT$(a$)="\"
- a$=LEFT$(a$,LEN(a$)-1)
- ENDIF
- CHDIR a$
- RETURN 0
- ENDFUNC
- '
- > FUNCTION files$(path$) !Get size&Date for files.bbs
- LOCAL t%,t$,d%,namn$
- '
- ~FSETDTA(BASEPAGE+128)
- e%=FSFIRST(path$,-1)
- DO UNTIL e%
- a|=PEEK(BASEPAGE+128+21) !Attribut
- IF (NOT BTST(a|,1)) AND (NOT BTST(a|,2)) AND (NOT BTST(a|,3)) AND (NOT BTST(a|,4))
- size$=STR$({BASEPAGE+128+26})!Size
- size$=SPACE$(7-LEN(size$))+size$+" "
- '
- d%=DPEEK(BASEPAGE+128+24) !Date
- d$=" "+STR$(d% DIV 512+80)
- d$=d$+RIGHT$("0"+STR$(d%/32 AND 15),2)
- d$=d$+RIGHT$("0"+STR$(d% AND 31),2)
- '
- RETURN size$+d$+" "+@fcount$(path$)
- ENDIF
- e%=FSNEXT()
- LOOP
- IF e%=-33
- RETURN " - - On Disk - - "
- ELSE
- RETURN ""
- ENDIF
- ENDFUNC
- > FUNCTION fcount$(path$) !Read Filecount
- fcount&=0
- FOR i%=1 TO lfd%
- get_files.dat(i%)
- EXIT IF (ffilename$=file$)
- NEXT i%
- c$=STRING$(3-LEN(STR$(fcounter&)),"0")+STR$(fcounter&)+" "
- RETURN c$
- ENDFUNC
- > FUNCTION update_fcount(path$) !Update Filecounter
- REPEAT
- IF INSTR(path$," ")
- file$=TRIM$(LEFT$(path$,INSTR(path$," ")))
- path$=TRIM$(MID$(path$,INSTR(path$," ")))
- ELSE
- file$=TRIM$(path$)
- path$=""
- ENDIF
- FOR i%=1 TO lfd%
- get_files.dat(i%)
- IF (ffilename$=file$)
- INC fcounter&
- put_files.dat(i%)
- i%=lfd%
- '
- INC downloads&
- ENDIF
- NEXT i%
- IF i%=lfd%+1
- fuploader$="Sysop"
- ffilename$=file$
- fcounter&=1
- INC lfd%
- fnumber&=lfd%
- fdelete|=0
- INC fcounter&
- put_files.dat(lfd%)
- '
- INC downloads&
- ENDIF
- UNTIL path$=""
- RETURN 0
- ENDFUNC
- > FUNCTION file_wrap$(a$) !Wrap Files.bbs
- LOCAL b$
- REPEAT
- IF LEN(a$)>80
- b$=b$+LEFT$(a$,RINSTR(a$," ",80))+cr$
- a$=SPACE$(33)+MID$(a$,RINSTR(a$," ",80))
- ELSE
- b$=b$+a$
- a$=""
- ENDIF
- UNTIL a$=""
- RETURN b$
- ENDFUNC
- > FUNCTION find_file$(path$,batch!) !Get size&Date for files.bbs
- LOCAL t%,t$,d%,namn$,s%
- '
- a$=""
- ~FSETDTA(BASEPAGE+128)
- e%=FSFIRST(path$,-1)
- DO UNTIL e%
- a|=PEEK(BASEPAGE+128+21) !Attribut
- IF (NOT BTST(a|,1)) AND (NOT BTST(a|,2)) AND (NOT BTST(a|,3)) AND (NOT BTST(a|,4))
- namn$=CHAR{BASEPAGE+158}
- a$=a$+" "+namn$
- s$=STR$({BASEPAGE+128+26})!Size
- ADD s%,VAL(s$)
- EXIT IF NOT batch!
- ENDIF
- e%=FSNEXT()
- LOOP
- RETURN STR$(s%)+" "+a$
- ENDFUNC
- '
- > FUNCTION gmts !Return no secounds since 1/1 1970
- proc$="FN gmts"
- LOCAL t%,d$,t$
- t%=599616000
- ' 1 jan 89 0:00:00
- d$=DATE$
- t$=TIME$
- ADD t%,3.1536E+07*(VAL(MID$(d$,9,2))-89)
- ADD t%,mnds%(VAL(MID$(d$,4,2)))
- ADD t%,86400*(VAL(d$)-1)
- ADD t%,3600*VAL(t$)
- ADD t%,60*VAL(MID$(t$,4,2))
- ADD t%,VAL(MID$(t$,7,2))
- '
- ' correctie voor schrikkeljaar 1990
- ' tegen 1994 wordt dit prg toch niet meer gebruikt :-)
- IF VAL(MID$(d$,9,2))>=90 AND VAL(MID$(d$,4,2))>=3
- ADD t%,86400
- ENDIF
- '
- RETURN t%
- ENDFUNC
- > FUNCTION dates$ !Return Date-Field for MSGS
- proc$="FN Date$"
- a$=""
- a$=LEFT$(DATE$,2)+" "
- a$=a$+mnd$(VAL(MID$(DATE$,4,2)))+" "
- a$=a$+RIGHT$(DATE$,2)+" "
- a$=a$+TIME$
- RETURN a$
- ENDFUNC
- > FUNCTION read_msgs$(offset%,size&) !Read in a MSG-Text
- proc$="FN Read_MSG$()"
- OPEN "I",#1,msg_path$+area_name$+".MSG"
- SEEK #1,offset%
- indata$=INPUT$(size&,#1)
- indata$=LEFT$(indata$,LEN(indata$)-1)
- CLOSE #1
- RETURN indata$
- ENDFUNC
- > FUNCTION dfree(drive$) !Return freespace in array free%()
- IF drive$=""
- free%(0)=MALLOC(-1)
- a%=BIOS(10)
- free%(1)=INT(DFREE(1)/1024)
- free%(2)=-1
- FOR i%=2 TO 15
- IF BTST(a%,i%)
- free%(i%+1)=INT(DFREE(i%+1)/1024)
- ELSE
- free%(i%+1)=-1
- ENDIF
- NEXT i%
- RETURN 0
- ELSE
- RETURN DFREE(ASC(drive$)-64)
- ENDIF
- ENDFUNC
- > FUNCTION timeleft !Return timeleft
- RETURN 30
- ENDFUNC
-